针对Google Closure Compiler的Underscore.js externs

Joh*_*yes 3 javascript google-closure-compiler backbone.js underscore.js

我正在使用Luke Rodgers的Backbone和Underscore externs,无法解决为什么_.extend在编译输出中被修改.

例如在Backbone 0.9.2中,以下代码(193:195):

if (defaults = getValue(this, 'defaults')) {
  attributes = _.extend({}, defaults, attributes);
}
Run Code Online (Sandbox Code Playgroud)

编译为:

if(c=r(this,"defaults"))a=f.extend({},c,a);
Run Code Online (Sandbox Code Playgroud)

我使用了以下编译命令:

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
Run Code Online (Sandbox Code Playgroud)

如果我包含另一个JavaScript文件:

     --js test.js
Run Code Online (Sandbox Code Playgroud)

包含以下内容:

_.extend({}, {name: 'test'});
Run Code Online (Sandbox Code Playgroud)

它未被修改compiled.js.

有谁知道为什么_.extend要修改backbone.js中的调用?

luk*_*ers 6

很高兴你发现我的externs文件很有用.在我的头脑中,我相信您遇到的问题是由于您使用externs文件并编译库.

通常,当库不是编译过程的一部分时,将使用externs文件.有些人可能只是使用(例如)jQuery,Underscore等预编译版本,或者链接到共享的Google库以利用预先缓存的js,但仍然希望Closure Compiler能够理解jQuery和Underscore API,所以他们使用外部.

如果您正在寻找的是Underscore和Backbone库中的显式类型注释,这是一个稍微不同的问题.