使用 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
如果我运行下面的代码经过高级优化,我仍然可以在代码中看到调试语句。
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