闭包优化+保持函数名称

时间:2013-12-13 11:17:03

标签: javascript google-closure-compiler

我有一个简单的例子:

使用Javascript:

function testBut(b){
   alert("!");
}

HTML:

<button onclick="testBut(this)">Test</button>

现在我通过Google Closure编译器运行我的.js脚本(从命令行运行),我想保持testBut函数不变。

我在许多地方读过我必须使用--externs选项并定义另一个带有导出函数名称的文件,在这种情况下它只能保存:

function testBut(b){}

另外我需要在我的js代码中添加有趣的行:

window['testBut']=testBut;

现在问题:

  • 在Closure中真的是如此愚蠢的系统,有两个容易出错的步骤,以保持所需的功能吗?

  • 是否没有符合相同目的的“@ ...”注释?我尝试了@export,但它需要--generate_exports选项,但它仍会生成类似的丑陋和无用的goog.a(“testBut”,testBut);在目标代码中(我尝试了相同的代码,那些goog.a(...)似乎没用),这仍然需要导出文件

理想情况下,我正在寻找简单的注释或命令行开关,它会告诉“不要删除/重命名此函数”,尽可能简单,不添加代码,没有其他文件。

由于

1 个答案:

答案 0 :(得分:4)

不要混淆外部和出口。

Externs - 在使用其他不会与您的来源一起编译的代码时提供类型信息和符号名称。

导出 - 使您的符号,属性或函数可用于其他无法编译的代码。

因此,在您的简单示例中,您需要:

function testBut(b){
   alert("!");
}
window["testBut"] = testBut;

然而,如果testBut仅用于外部呼叫,则可以进一步简化:

window["testBut"] = function(b) {
  alert("!");
};

为什么不总是使用第二种表示法?因为内部使用(在编译代码中调用)然后必须使用完整的引用语法来阻止类型检查并减少压缩。

为什么不使用JSDoc Annotation进行导出?

这个问题出现了很多。

首先,关于如何进行出口尚未达成全球共识。有不同的方法来完成导出。

此外,按定义导出符号和函数会阻止死码消除。以图书馆作者为例。作者希望编译他的图书馆,导出所有公共符号。但是,这样做意味着当其他用户在编译中包含其库时,不会发生死代码消除。这否定了ADVANCED_OPTIMIZATIONS的主要优点之一。

鼓励图书馆作者在文件底部或单独的文件中提供他们的导出,以便其他用户可以排除这些导出。

之前有人建议提供一个命令行参数来控制基于命名空间的导出。 IE就像--export mynamespace.*。但是,还没有作者解决过这个问题,这不是一个微不足道的改变。