我編譯下面的代碼使用Google Closure Compile ADVANCED_OPTIMIZATIONS:我該如何重寫這個Closure Compile來重命名我的函數?
(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會去掉調試函數(因爲它沒有在任何地方使用),但我希望能夠通過名稱空間中的函數調用它,並且仍然會重命名它。
我已經嘗試了上述代碼的各種版本。在Helper
上使用prototype.debug,將Helper構造函數移動到與Namespace相同的作用域等等。只要調試函數附加到我的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;如果(goog.DEBUG){..代碼未編譯時設置編譯器--define goog.DEBUG = false ...} – HMR
我不知道如果閉包編譯器與您創建它們的方式創建對象很好。如果使用var Helper = function(){}定義幫助器,調試將被重命名; Helper.prototype.debug = function(){}?或者:var Helper = {debug:function(){}}你的模式看起來像是用於通過閉包創建私有變量的東西,但是在閉包庫代碼中沒有看到它,他們會使用帶有@private註解的this.private_來代替。 – HMR
嗨@HMR感謝您的輸入。我不知道'good.DEBUG',但是我有很多其他函數連接到Helper,我想將其重命名爲短名稱,而不是重命名。我嘗試了兩種初始化Helper的方法,但仍然存在同樣的問題。 – Paulpro