Google Closure Compiler的Underscore.js外部接口文件

3
我将使用Luke Rodgers的Backbone和Underscore externs,但无法理解为什么_.extend在编译输出中被修改。
例如,在Backbone 0.9.2中,以下代码(193:195):
if (defaults = getValue(this, 'defaults')) {
  attributes = _.extend({}, defaults, attributes);
}

编译后被转换为:

if(c=r(this,"defaults"))a=f.extend({},c,a);

我使用了以下编译命令:

java -jar compiler.jar 
     --externs backbone-0.9.2-externs.js 
     --externs underscore-1.3.3-externs.js 
     --compilation_level ADVANCED_OPTIMIZATIONS 
     --js underscore-1.3.3.js  
     --js backbone-0.9.2.js 
     --js_output_file compiled.js

如果我包含另一个JavaScript文件:
     --js test.js

包含以下内容:

_.extend({}, {name: 'test'});

这段代码在compiled.js文件中未被修改。

有人知道为什么在backbone.js中调用_.extend会被修改吗?


愚蠢的问题 - 它工作吗? - tkone
上面的代码只是一个小例子,用来突出问题。在我的应用程序中,我遇到了错误:“未捕获的类型错误:无法调用未定义的方法'extend'”,“未捕获的类型错误:无法调用未定义的方法'each'”,“未捕获的引用错误:Backbone未定义”,... - John Keyes
1个回答

6
很高兴您发现我的外部文件很有用。我想,您遇到的问题可能是由于同时使用外部文件和编译库所致。
通常情况下,当库不是编译过程的一部分时,会使用外部文件。有些人可能只是使用预编译版本的jQuery、Underscore等,或链接到共享的Google库以利用预缓存的js,但仍希望让Closure Compiler理解jQuery和Underscore API,因此使用外部文件。
如果您要查找的是Underscore和Backbone库中的显式类型注释,则这是一个稍微不同的问题。

1
啊哈,我显然正在经历一个“如果我用足够大的锤子猛击它,它一定会工作”的时刻。因此,在使用ADVANCED_OPTIMIZATIONS时,似乎没有办法创建一个包含Underscore和Backbone的单个JavaScript文件,同时使用Closure Compiler。 - John Keyes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接