Poi*_*ull 5 javascript google-closure-compiler
我有一个简单的例子:
JavaScript:
function testBut(b){
alert("!");
}
Run Code Online (Sandbox Code Playgroud)
HTML:
<button onclick="testBut(this)">Test</button>
Run Code Online (Sandbox Code Playgroud)
现在我通过 Google Closure 编译器运行我的 .js 脚本(从命令行运行),并且我想保持 testBut 函数完整。
我在很多地方读到我必须使用 --externs 选项并使用导出函数的名称定义另一个文件,在这种情况下它将仅包含:
function testBut(b){}
Run Code Online (Sandbox Code Playgroud)
另外,我需要在我的 js 代码中添加有趣的行:
window['testBut']=testBut;
Run Code Online (Sandbox Code Playgroud)
那么现在问题:
为了保持所需的功能,Closure 中的系统真的很愚蠢吗?需要完成两个容易出现错误的步骤?
是否没有“@...”注释可以简单地满足相同的目的?我尝试了@export,但它需要 --generate_exports 选项,并且仍然生成类似的丑陋且无用的 goog.a("testBut", testBut); 在目标代码中(我尝试了相同的代码,那些 goog.a(...) 似乎根本没用),这仍然需要导出文件
理想情况下,我正在寻找简单的注释或命令行开关来告诉“不要删除/重命名此函数”,尽可能简单,不添加代码,不添加其他文件。
谢谢
不要混淆外部和导出。
外部- 在使用不会与源代码一起编译的其他代码时提供类型信息和符号名称。
导出- 使您的符号、属性或函数可供其他不会被编译的代码使用。
因此,在您的简单示例中,您需要:
function testBut(b){
alert("!");
}
window["testBut"] = testBut;
Run Code Online (Sandbox Code Playgroud)
testBut然而,如果仅用于外部调用,则可以进一步简化:
window["testBut"] = function(b) {
alert("!");
};
Run Code Online (Sandbox Code Playgroud)
为什么不总是使用第二种表示法?因为内部使用(编译代码内的调用)必须使用完整的引用语法,这会阻止类型检查并减少压缩。
这个问题经常出现。
其一,全球对于如何进行出口尚未达成共识。有多种方法可以完成导出。
此外,按定义导出符号和函数会阻止死代码消除。以图书馆作者为例。作者希望编译他的库,导出所有公共符号。然而,这样做意味着当其他用户在编译中包含他的库时,不会发生死代码消除。这否定了 ADVANCED_OPTIMIZATIONS 的主要优点之一。
鼓励库作者在文件底部或单独的文件中提供导出内容,以便其他用户可以将其排除。
之前已经建议提供命令行参数来控制基于命名空间的导出。IE之类的东西--export mynamespace.*。然而,还没有作者解决这个问题,这不是一个微不足道的改变。
| 归档时间: |
|
| 查看次数: |
1067 次 |
| 最近记录: |