使用 Google Closure 编译器删除调试代码

Debug code removal using Google Closure Compiler

如果我运行下面的代码经过高级优化,我仍然可以在代码中看到调试语句。

var log = console.info.bind(console);
  (function() {
       /** @const */
       var DEBUG = false;

       log('Brady', createRank({
           max: 100,
           debug: DEBUG
      }));
  })();
 function createRank(options) {
     if (options.debug) {
         log('This should be in debug mode only');
     }
     if(typeof alert == 'function'){
         alert(options);
     }
     return (Math.random() * options.max) | 0;
}

高级模式编译后的输出

(function() {
      var a = console.info.bind(console),
            b = {
                max: 100,
                debug: !1
            };
       b.debug && a("This should be in debug mode only");
       "function" == typeof alert && alert(b);
       a("Brady", Math.random() * b.max | 0);
   })();

我们如何使用高级模式摆脱调试消息?

如果 DEBUG 变量被定义为全局变量,并且日志语句像

如果(调试){ 日志('debug message'); }

那么它会起作用,但是如果我们不希望它作为全局变量,而是通过参数将值传递给个人 modules/functions,有没有办法让它起作用。

这是当前优化集的限制,当它们是 运行 时。优化是编译时间和优化之间的权衡,做出的选择不一定适合每个代码模式。

在这种特殊情况下,问题是 "property collapsing" 只在全局范围内发生一次,那是在函数内联发生之前("property collapsing" 对于函数局部对象发生在主优化期间环形)。要删除示例中的代码,"collapse properties" 需要至少再 运行 一次,或者函数本地版本(更保守)需要增强到 运行在全球范围内。

这也在这里讨论:https://github.com/google/closure-compiler/issues/891