我已按照the advice from this other SO thread从我的代码中删除了console.log()
个语句。
不幸的是,现在Closure编译器正在删除我的整个代码而不仅仅是console.log()
语句。
有人可以解释一下吗?我不知所措......
JS文件1
(function(){
/** @const */
LOG = false;
function log() {
return console.log.apply(console, arguments);
}
LOG && log('hello world !');
var foo='bar';
LOG && log("foo"+foo);
})();
JS文件2
(function(){
/** @const */
LOG = false;
function test(){
alert('testing...');
}
var baz='bazzy';
LOG && log("baz"+baz);
})();
关闭编译器步骤:
$ java -jar compiler-latest/compiler.jar --js j1.js j2.js --js_output_file compiled.js
结果:
(function(){LOG=!1})();(function(){LOG=!1})();
答案 0 :(得分:2)
因为编译器确定您的其余代码无法访问。
两个文件都将常量LOG设置为false,并且您不导出任何内容(goog.export *或window ['...'] = ...)。 可以执行的代码有LOG&&在它面前,这意味着它没有被执行。
因此无法执行任何操作,因此编译器会将其全部删除。
为什么功能测试被删除:没有人调用它,简单就是这样。在你的一个文件中调用它,编译器不会将其剥离。
您可以(应该,实际上)定义LOG并仅在一个文件中记录。 为此,请删除每个文件中代码周围的匿名函数调用。 您可以告诉编译器使用命令行选项将其添加回已编译的代码:
--output_wrapper=(function(){ %output% })();
所以你的两个文件应该是这样的:
JS文件1
/** @const */
var LOG = false;
function log() {
return console.log.apply(console, arguments);
}
LOG && log('hello world !');
var foo='bar';
LOG && log("foo"+foo);
JS文件2
function test(){
alert('testing...');
}
var baz='bazzy';
LOG && log("baz"+baz);
// call test, so it a) isnt stripped and b) well, executed :)
test();
此外,您可能希望将全局变量和函数放入“命名空间”,以免污染全局范围:
// create namespace (which is just a normal object)
var MyNamespace = {};
// create a namespaced function
MyNamespace.test = function() {
alert('test');
}
// call it
MyNamespace.test();