2012-02-28 69 views
3

如何告訴Closure編譯器不要重命名內部函數?例如,鑑於此代碼:如何告訴Closure編譯器不要使用SIMPLE_OPTIMIZATIONS重命名內部函數?

function aMeaninglessName() { 
    function someMeaningfulName() { 
    } 

    return someMeaningfulName; 
} 

...我沒事用封重命名外部函數(我積極地希望它來,以節省空間),但我想要的功能名稱someMeaningfulName單獨留在家中(這樣在調用堆棧中顯示的名稱是「someMeaningfulName」,而不是「a」或其他)。儘管調用它的代碼將通過工廠函數返回的引用來完成,而不是通過代碼中的名稱。例如,這純粹是爲了調試支持。

注意,我希望函數有實際的名稱,不得匿名,並使用該名稱分配給某些屬性,因此例如這不是this other question重複。

這個有點難理解的用例似乎不屬於extern或exports功能。 (我有點希望會有一些annotation我可以扔在它。)但我不是Closure Compiler大師,我希望你們中的一些人。當然,如果沒有辦法做到這一點,這是一個可以接受的答案。


(用例是響應呼叫到它創建的函數庫。我想提供一個版本,我們被封閉與SIMPLE_OPTIMIZATIONS預壓縮的庫,但如果有人使用該副本我們希望他們看到有意義的名字,我可以用eval解決它,或者手動編輯壓縮結果[in事實上,上下文足夠獨特,我可以在其上輸入一個sed腳本],但這很尷尬,並坦率地把我們帶入「不值得打擾」的領域,因此尋找一種簡單,低維護的方式。)

回答

1

沒有簡單的方法來做到這一點。你將不得不創建一個CodingConvention類的自定義子類來表明你的方法是「本地」的extern(支持這個是爲了處理Prototype庫而添加的)。 InlineVariables,InlineFunctions或RemoveUsedVariables可能仍會嘗試刪除名稱,並且還需要修正。

另一種方法是使用源映射將堆棧跟蹤重新映射到原始源。

+0

因此,如果我認爲這是值得的,我會用我自己的本地定製版本的編譯器,它具有'CodingConventions.Proxy'來包裝默認的編碼約定,並重寫...什麼,'isPrivate '爲了讓那個成員返回'false'? – 2012-02-28 17:38:14

+0

isExported(String name,boolean local)是感興趣的方法,特別是當「local」爲true時。 – John 2012-02-29 01:13:14

+0

謝謝。那麼我必須破解'CommandLineRunner'來添加一個標誌?從外觀上看,我可能想要包裝或擴展'ClosureCodingConvention'而不是默認的,以獲得我通常得到的相同行爲以及我的特殊位。總的來說,這不算太糟糕,Closure下載和構建沒有任何麻煩。如果我覺得真的很有野心,我可能會添加一個註釋,並將其作爲補丁提供。 – 2012-02-29 07:13:54

0

閱讀以下部分

https://developers.google.com/closure/compiler/docs/api-tutorial3#export

兩個選項,基本上,使用對象[「functionName」] = obj.functionName或更好的方式使用 和exportSymbol exportProperty兩者goog對象上,這裏是文檔鏈接對於

http://closure-library.googlecode.com/svn/docs/closure_goog_base.js.html

- 編輯 啊,我現在看到的,我的第一個答案是不是你那麼大。編譯器有一些有趣的標誌,你可能感興趣的標誌是DEBUG,你可以將變量傳遞給編譯器,它允許你在通過日誌記錄中刪除一些調試註釋,或者只是一個字符串,因爲你使用的是簡單模式。

所以如果你使用閉包,你可以對開發版本進行調試,這個開發版本只是一個建立了解決方案的頁面。我們也在代碼中放下以下代碼

if(DEBUG){ 
    logger.info('pack.age.info.prototype.func'); 
} 
+0

也曾經是一個螢火蟲插件,但它現在已經失效。如果你在一般情況下使用閉包,我們傾向於做的是構建一個開發版本,它只是解決了依賴關係(在Chrome調試器中,你實際上可以看到整個類路徑,而不僅僅是Firebug中的Object),並且具有以下類型的行在每個函數成員 – lennel 2012-02-28 12:30:53

相關問題