闭包编译器可以使用链接作为最小化技术吗?

Can closure compiler use chaining as a minification technique?

本文关键字:最小化 技术 编译器 可以使 链接 闭包      更新时间:2023-09-26
// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// @exclude_default_externs true
// @js_externs var console = {log: function(){}};
// @output_file_name default.js
// ==/ClosureCompiler==
/** @constructor */
function Test(){};
Test.prototype['action'] = function(){ 
  console.log('Hello');
  return this;
}
var test = new Test();

如果我添加一行:

test['action']()['action']()['action']();

并编译它,我得到这个大小:

113 bytes (101 bytes gzipped)

如果我用下面的代码替换这一行:

test['action']();
test['action']();
test['action']();

我得到了这个大小:

123 bytes (108 bytes gzipped)

我希望闭包编译器会认识到,因为我的函数返回this,它可以将调用链接到action(它是如何在第一个测试中完成的)并获得较小的大小结果。是否有一种方法来注释上述代码,使闭包编译器能够进行这种优化?

注:大小的差异是由链接引起的。输出的差异如下:

与链接:

(new a).action().action().action();
没有链接:

var b=new a;b.action();b.action();b.action();

有一个编译器传递:

https://code.google.com/p/closure-compiler/source/browse/src/com/google/javascript/jscomp/ChainCalls.java

默认情况下不启用。它没有为我们测试的项目提供任何保存,但您可以尝试启用它。它由编译器的Java API中的"CompilerOptions#setChainCalls"方法控制。