【问题标题】:Removing console.log with closure compiler使用闭包编译器删除 console.log
【发布时间】:2013-09-21 03:56:25
【问题描述】:

我想通过删除所有 console.log("blah blah") 调试语句来准备我的 JS 代码生产。 this popular SO answer (code below) 对如何使用流行的 JS 压缩器/编译器 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() 给出了错误?我在这里遗漏了什么明显的东西吗?

<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);

【问题讨论】:

  • log 是一个通用的日志记录函数,它可以简单地作为console.log 的包装器,或者可以提供一些其他类型的日志记录。它只是用于演示。该定义留给读者作为练习。
  • @ChadKillingsworth 谢谢,我不知道这是练习还是我尚未了解 JS 的东西。

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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 谢谢!我现在已经更好地解释了我的问题中“多个文件”的含义。请查看修改。
  • -@user2736012 你能提供一个“将它们连接到一个立即调用的函数中的构建过程”的基本示例吗?我不太清楚你的意思。 Closure 编译器正在从我的 file1.js、file2.js、jquery.js 等生成一个大 JS 文件。
  • 一些服务器端代码,以促进将您的单个文件、将它们合并到一个文件中、针对文件运行所需进程(如闭包编译器)并将结果输出到新文件的自动化过程要包含在您的项目中的文件。
  • 好的,谢谢,现在很清楚了。最后一个问题:为什么只有一个全局?只是导致良好的代码实践?防止名称冲突?其他原因?
  • @timpeterson:是的,最好的做法是尽量减少主要为您所描述的目的而创建的全局变量的数量......名称冲突。
【解决方案2】:

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

var LOG = false;

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

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

【讨论】:

  • -@IvanKuckir 谢谢。 “我认为你不明白你的链接的答案”。是的,这就是我问这个问题的原因。 :)
猜你喜欢
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多