6

Google Closure Compiler 重命名代码中的所有“true”、“false”和“null”出现;

var s = true, x = null, V = false;

并改用这些速记;在以下情况下;

if (someVariable == s)

现在; Google Analytics 代码定义了它自己的“s”变量;覆盖值“true”;正如你所看到的,这会导致很多问题。

我不想更改 GA 代码;我只是想让 Closure Compiler 退出重命名 true 等。Externs 不起作用。

你知道有什么方法可以做到这一点吗?

4

3 回答 3

11

事实证明,可以通过一个名为“output_wrapper”的参数来阻止 Google Closure Compiler 将全局定义(函数和/或变量)打印到命令行代码中,例如:

java -jar compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --output_wrapper "(function(){%output%})();" --js input.js --js_output_file output.js

这样,它就不会与全局变量发生冲突,并将所有代码打印在匿名函数包装器中。

于 2011-01-06T19:49:15.353 回答
1

您的主要问题是您的代码在全局范围/命名空间中运行,这就是事情崩溃的原因。

要修复它,请将其放入匿名函数包装器中:

(function() {
    // a self contained "namespace"
    var s = true; // won't be affected by the analytics code anymore       


    // expose something
    window.foo = function() {};

})(); // execute the function immediately

这是防止变量名等冲突常用习惯用法。如果您需要在包装器之外提供可用的东西,只需将它们作为属性添加到window对象中即可。

不要费心去搞乱闭包,当你改变你的代码时,它最终可能会给变量不同的名字。另外,当您的页面上突然出现更多全局变量时怎么办?所有这些问题都是将代码始终放在上述包装器中的充分理由。

于 2011-01-06T19:10:17.303 回答
1

有一个CompilerOptions名为aliasKeywords的选项。当设置为 时false,编译器不会为 'true'、'false' 和 'null' 设置别名。

于 2014-04-22T16:42:21.240 回答