Closure Compiler 提供三種編譯層級,從簡單移除空白字元和註解,到積極轉換程式碼都有。
WHITESPACE_ONLY
WHITESPACE_ONLY
編譯層級會從程式碼中移除註解,也會移除換行符、多餘的空格、多餘的標點符號 (例如括號和半形分號) 和其他空白字元。輸出 JavaScript 在功能上與來源 JavaScript 完全相同。
如果要求的輸出語言模式與輸入語言模式不同,系統仍會轉譯語言功能。請參閱「旗標和選項」中的 --language_in
和 --language_out
。
這個編譯層級的壓縮程度最低。
SIMPLE_OPTIMIZATIONS
SIMPLE_OPTIMIZATIONS
編譯層級會執行與 WHITESPACE_ONLY
相同的空白字元和註解移除作業,但也會在運算式和函式中執行最佳化作業,包括將本機變數和函式參數重新命名為較短的名稱。將變數重新命名為較短的名稱,可大幅縮減程式碼大小。由於 SIMPLE_OPTIMIZATIONS
層級只會重新命名函式本機的符號,因此不會干擾已編譯 JavaScript 與其他 JavaScript 之間的互動。
只要程式碼不是使用字串名稱存取本機變數 (例如使用 eval()
陳述式,或對函式呼叫 toString),使用 SIMPLE_OPTIMIZATIONS
編譯時一律會保留語法有效的 JavaScript 功能。
SIMPLE_OPTIMIZATIONS
是預設的編譯層級。
ADVANCED_OPTIMIZATIONS
ADVANCED_OPTIMIZATIONS
編譯層級會執行與 SIMPLE_OPTIMIZATIONS
相同的轉換,但會加入各種更積極的全域轉換,以達到三種層級中最高的壓縮率。ADVANCED_OPTIMIZATIONS
層級可壓縮 JavaScript,效果遠勝其他工具。
為啟用這項極致壓縮功能,ADVANCED_OPTIMIZATIONS
會對編譯後的程式碼做出強烈假設。如果程式碼不符合這些假設,ADVANCED_OPTIMIZATIONS
會產生無法執行的程式碼。
舉例來說,除非採取特殊步驟確保互通性,否則使用 ADVANCED_OPTIMIZATIONS
編譯的程式碼可能無法與未編譯的程式碼搭配運作。如果您未標記程式碼中參照的外部函式和屬性,Closure 編譯器會不當重新命名程式碼中的參照,導致程式碼和外部程式碼中的名稱不符。
如要進一步瞭解如何準備 ADVANCED_OPTIMIZATIONS
的程式碼,請參閱「進階編譯和外部函式」。
ADVANCED_OPTIMIZATIONS
轉換包括:
- 更積極的重新命名:
使用
SIMPLE_OPTIMIZATIONS
編譯時,只會重新命名函式中的參數和變數。ADVANCED_OPTIMIZATIONS
也會重新命名全域變數、函式名稱和屬性。 - 移除無效程式碼:
使用
ADVANCED_OPTIMIZATIONS
進行編譯時,系統會移除可證明無法存取的程式碼。如果搭配大型程式庫使用,效果會特別顯著。如果您只使用大型程式庫檔案中的少數函式,編譯器可以從輸出內容中移除這些函式以外的所有項目。 - 全域內嵌:
使用
ADVANCED_OPTIMIZATIONS
進行編譯時,系統會以函式主體取代部分函式呼叫。這項轉換稱為「內嵌」。只有在判斷內嵌函式安全且可節省空間時,編譯器才會內嵌函式。編譯 時,如果編譯器判斷可以安全地執行這項作業,也會內嵌常數和部分變數。ADVANCED_OPTIMIZATIONS
如何設定編譯層級
如要在 Closure Compiler 應用程式中設定編譯層級,請加入指令列標記 --compilation_level
,並將值設為 WHITESPACE_ONLY
、SIMPLE
或 ADVANCED
,如下列指令所示:
java -jar compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --js hello.js