【发布时间】:2013-06-07 00:15:56
【问题描述】:
我正在使用 Google Closure Compile 使用 ADVANCED_OPTIMIZATIONS 编译以下代码:
(function() {
/** @const */
var DEBUG = false;
var Namespace = {};
window['Namespace'] = Namespace;
(function() {
/**
* @constructor
*/
function Test(tpl) {
Helper.debug('Test');
}
Namespace['Test'] = Test;
})();
var Helper =
(function(){
/**
* @constructor
*/
function Helper(){
this.debug = function(arg){
if(DEBUG){
console.log(arg);
}
}
};
return new Helper;
})();
})();
我的目的是让编译器在 DEBUG == false 时删除所有 Helper.debug 消息,并在 DEBUG == true 时将调试函数重命名为短名称。我希望编译器能得到这样的结果:
DEBUG == false:
var a={};window.Namespace=a;a.Test=function(){};
DEBUG == true:
var a={};window.Namespace=a;a.Test=function(){console.log("Test")};
我最终得到了这个:
DEBUG == false:
var a={};window.Namespace=a;a.Test=function(){b.debug("Test")};var b=new function(){this.debug=function(){}};
DEBUG == true:
var a={};window.Namespace=a;a.Test=function(){b.debug("Test")};var b=new function(){this.debug=function(c){console.log(c)}};
在这两种情况下,debug 函数都没有重命名。我认为它应该是,因为它没有被导出,也不能从Namespace 访问(据我所知)。它只能从 Namespace.Test() 构造函数中调用。如果我不从那里调用它,Closure 会剥离调试函数(因为它没有在任何地方使用),但我希望能够通过命名空间中的函数调用它,并且仍然对其进行重命名。
我已经尝试了上述代码的各种版本。在Helper 上使用prototype.debug,将Helper 构造函数移动到与命名空间相同的范围等。只要将调试函数附加到我的Helper 对象,我就找不到从编译器。
如果我不使用 Helper 对象,而只是将 debug 声明为一个函数,我会得到我想要的输出,但这只是一个示例,我确实有许多附加到 Helper 对象的函数,并且我希望将它们全部重命名为短名称。给出我想要的输出的示例代码:
(function() {
/** @const */
var DEBUG = false;
var Namespace = {};
window['Namespace'] = Namespace;
(function() {
/**
* @constructor
*/
function Test(tpl) {
debug('Test');
}
Namespace['Test'] = Test;
})();
function debug(arg){
if(DEBUG){
console.log(arg);
}
}
})();
【问题讨论】:
-
您可以使用 goog.DEBUG 获得条件代码; if(goog.DEBUG){.. 设置编译器时未编译代码 --define goog.DEBUG=false ...}
-
我不确定闭包编译器是否适用于以您创建它们的方式创建的对象。如果使用 var Helper = function(){};Helper.prototype.debug=function(){} 定义 helper,调试会被重命名吗?或: var Helper ={debug:function(){}} 您的模式看起来像是用于通过闭包创建私有变量的东西,但在闭包库代码中的任何地方都看不到,他们会使用 this.private_ 和 @private 注释。
-
嗨@HMR 感谢您的意见。我不知道
good.DEBUG,但我有许多其他附加到 Helper 的函数,我想将它们重命名为短名称,但没有一个函数被重命名。我尝试了其他两种初始化 Helper 的方法,但我仍然遇到同样的问题。 -
我建议你用@define developers.google.com/closure/compiler/docs/js-for-compiler 替换一些常量.然后编译器将删除死掉的代码。基本上
goog.DEBUG是您使用编译器选项更改的常量之一。 -
更新了答案,
debug未重命名的原因是因为它在默认的 externs 文件中使用(其中定义了 document、window、document.getElementById ...)
标签: javascript google-closure-compiler