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

问题描述 投票:7回答:3

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

/** @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()给出错误?我错过了一些明显的东西吗?

<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);
javascript debugging global-variables closures google-closure-compiler
3个回答
2
投票

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

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

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

使用log()意味着有人定义了log()函数,因此它不那么冗长。

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

0
投票

我想你不明白你的链接的答案。作者建议您创建一个新变量

var LOG = false;

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.