[英]can TypeScript output annotations for Closure Compiler?
我正在使用TypeScript,我想使用Closure-Compiler來縮小和混淆我在構建TS代碼后得到的JS輸出。
我讀到GCC能夠根據類型定義進行混淆。 據我所知(如果我錯了請糾正我),這意味着如果我的代碼上有類型注釋,那么GCC將使用它們來進行更好的混淆。
例如,對於obj.someProp
GCC當前在我的代碼中查找someProp
屬性名稱的所有實例,而不考慮它所在的對象,並將所有這些實例替換為相同的混淆名稱(例如oa
)。
但是如果我在我的代碼上有類型注釋,GCC將能夠知道哪個對象屬於哪種類型並相應地對其進行模糊處理 - 因此兩個不同類型的相同屬性名稱將被混淆為兩個不同的名稱。
問題:
編輯
截至20150315版本的Closure-compiler,默認情況下啟用基於類型的優化。
“使用優化類型”會觸發多個編譯器優化:
消歧在優化過程的早期發生,並使類型無意識優化能夠刪除未使用的屬性,虛擬化和其他優化
在重命名之前就出現了ambiguation,它專門用於通過利用較短的名稱並使它們更常見來改善代碼大小(這可以改善gzipping)
內聯屬性使用類型信息來內聯屬性,否則這些屬性不會被虛擬化。 這個過程效果較差,因此討論不那么有趣。
這些優化對於大型項目非常有效,但由於通常沒有任何運行時類型實施,因此存在一些風險。 有可能以各種無意的方式對這些類型撒謊。 我在這個項目維基頁面中更詳細地描述了風險:
https://github.com/google/closure-compiler/wiki/Type-Based-Property-Renaming
風險很低,但可以通過使用編譯器支持的“運行時類型檢查”檢測來減輕風險。 如果您正在嘗試改造更大的項目或無法隔離“錯誤”消歧,請查看“運行時類型檢查”
TypeScript問題是一個單獨的問題,應該是一個單獨的問題。 可以在某種程度上將TypeScript轉換為Closure Compiler類型系統,但TypeScript和Closure Compiler類型系統之間存在差異(TypeScript明顯不合並且允許許多不安全的分配)。
你的理解大多是正確的。 基於類型的重命名(需要--use_types_for_optimization
標志)的優點是,不再阻止命名與extern中的任何屬性相同的屬性重命名。
var foo = {};
foo.src = 'test'; //only renameable with type based optimizations
至於typescript,正在修改closure-compiler以理解類型 - 腳本樣式類型表示法。 然而,這個項目還處於初期階段。 您鏈接的插件是我現在知道的最佳選擇。
Typescript和Closure-Compiler中的類型系統現在不完全兼容。 這也正在積極開展。
我認為Google Closure Compiler將在不久的將來支持TypeScript注釋。 看這里
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.