使用闭合编译器删除console.log

时间:2013-09-16 21:20:39

标签: javascript debugging global-variables closures google-closure-compiler

我想通过剥离所有console.log("blah blah")调试语句来使我的JS代码生成准备就绪。关于如何使用this popular SO answer (code below)这个流行的JS minifier /编译器,我对Google's closure compiler感到困惑。

/** @const */
var LOG = false;
...
LOG && log('hello world !'); // compiler will remove this line
...

//this will even work with `SIMPLE_OPTIMALIZATIONS` and no `--define=` is necessary !

两个问题:

  1. 倍数文件:上述代码如何处理多个文件(以下基本示例)?它必须处于关闭状态,对吧?这不是意味着您必须在每个页面上放置此代码吗?此外,它是否也意味着您必须在每个页面上的这些闭包内将var foo='bar'var window.foo='bar';的全局变量更改为全局变量?

  2. 小问题:不应该是console.log('...')而不是log('...'),因为log()会出错吗?我错过了一些明显的东西吗?

  3. <script src='/assets/js/file1.js'></script> <script src='/assets/js/file2.js'></script>

    file1.js的内容:

    var foo='bar';
    console.log("foo"+foo);
    

    file2.js的内容

    var baz='bazzy';
    console.log("baz"+baz);
    

3 个答案:

答案 0 :(得分:2)

如果您将代码拆分为多个文件,我认为您希望有一个构建过程将它们连接到一个立即调用的函数中。然后,您的var LOG = false;可以只包含在顶部一次。

如果通过“每个页面”,您的意思是每个页面都有单独的JavaScript文件,这些文件不能连接在一起,那么是的,您需要将代码放在每个页面的顶部,但是“我也没有充分利用Closure Compiler。

关于全局变量,是的,你需要在设置时使用window,但我希望你只定义一个全局变量。

log()的使用意味着有人定义了log()函数,因此它的详细程度较低。

function log() {
    return console.log.apply(console, arguments);
}

答案 1 :(得分:0)

我认为你不理解你的链接的答案。作者建议您创建一个新变量

var LOG = false;

然后你只需写LOG && __code__ ;(coressponds到if(LOG) __code__ ;)和&amp;&amp;&amp;因为部分评估布尔表达式,所以不会被处理。将LOG设置为true后,将对其进行处理。该变量通常称为“开关”或“标志”。

顺便说一句,Closure Compiler可能会编辑你的代码,但代码必须在“编译”之后表现出与之前相同的。这是所有这些缩小器和优化器的主要原则(它们不能将您的快速排序转换为GTA 5)。所以不要使用Closure Compiler来使你的代码以不同的方式工作(如果不是这样的话 - 它们就会有错误!)。

答案 2 :(得分:0)

我能够使用闭包编译器编译出console.log。但这似乎是网络钓鱼方案,因为使用编译器后,下载消失了,而当我再次下载Java封闭编译器时,它无法加载。 Google的开发人员似乎正在利用搜索兴趣来出售服务或非法收集代码。