我正在使用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;
})();
})();
我的目的是让编译器在什么时候剥离所有 Helper.debug 消息DEBUG == false
,并在什么时候将调试函数重命名为一个短名称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 会剥离调试功能(因为它没有在任何地方使用),但我希望能够通过命名空间中的函数调用它,并且仍然可以对其进行重命名。
我已经尝试了上述代码的各种版本。使用prototype.debug on Helper
,将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);
}
}
})();