javascript - Closure Compiler 如何使用类型信息来编译更快的 JavaScript?

标签 javascript google-closure-compiler

谷歌的 Closure Compiler编译成更高效的 JavaScript。我可以想象几个简单的例子,比如 Closure Compiler 通过直接调用函数或用文字替换常量来减少调用堆栈。但是 documentation更进一步说,

"The Closure Compiler can use data type information about JavaScript variables to provide enhanced optimization and warnings."

我的理解是类型化语言有两个好处:1) 类型检查可以在编译期间捕获错误——我可以看到 Closure Compiler 如何模拟这种行为——以及 2) 程序实际上执行得更快,因为它被编译成另一个语言(比如 Java 到 Java 字节码)。使用 Closure Compiler,输出仍然是 JavaScript。如何根据类型信息进行优化?

最佳答案

一个例子是 disambiguateProperties 功能,描述于 http://closuretools.blogspot.com/2011/01/property-by-any-other-name-part-3.html

如帖子所述,这允许编译器选择较短的属性名称。它还允许编译器消除更多的死代码。假设您在代码中调用了 x.foo(),并且有两种不同的类型都具有 foo 方法:

X1.prototype.foo = function() {
  // Lots and lots of code...
};


X2.prototype.foo = function() {
  // Lots and lots of code...
};

如果编译器不知道 x 是什么类型,它必须在代码中保留两个长 foo 方法,即使其中一个可能永远不会被调用.如果它知道 xX1 类型,那么它会将方法重命名为 X1$fooX2$foo(或类似的东西)。然后,它可以看到 X2$foo 从未被调用,因此它将它从编译代码中删除。这意味着要下载和解析的代码更少,因此它可以使页面感觉加载得更快,并且 JS 解释器必须保留在内存中的函数更少。

关于javascript - Closure Compiler 如何使用类型信息来编译更快的 JavaScript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21616176/

相关文章:

javascript - 在动态组件中仅安装一次触发器

javascript - 如何在使用 JavaScript 或 jquery 上传之前预览图像?

javascript - 使用 Google Closure 的复选框

javascript - 如何在浏览器中使用 Google 编译器而不请求服务?

javascript - 使用闭包编译器时出现扩展错误

javascript - 使用带有 HTML 自定义元素的模板

javascript - 在 Jquery onClick 中重新启动 slider ?

javascript - 与 Chai 一起处理 promise 拒绝

javascript - 如何使用 Google Closure Compiler 声明动态属性?

javascript - 结构体和字典有什么区别?