8

我想通过删除所有console.log("blah blah")调试语句来准备我的 JS 代码生产。我对这个流行的 SO 答案(下面的代码)感到困惑,关于如何使用谷歌的闭包编译器(一种流行的 JS 压缩器/编译器)来做到这一点。

/** @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);
4

2 回答 2

2

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

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

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

的使用log()意味着有人定义了一个log()函数,以便它不那么冗长。

function log() {
    return console.log.apply(console, arguments);
}
于 2013-09-16T21:26:38.587 回答
0

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

var LOG = false;

然后您只需编写LOG && __code__ ;( coressponds to if(LOG) __code__ ;) 并且 && 之后的代码将不会被处理,因为布尔表达式的部分评估。在您将 LOG 设置为 true 后,它将被处理。该变量通常称为“开关”或“标志”。

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

于 2013-09-16T21:32:25.043 回答