簡體   English   中英

可以為Closure Compiler輸出TypeScript輸出注釋嗎?

[英]can TypeScript output annotations for Closure Compiler?

我正在使用TypeScript,我想使用Closure-Compiler來縮小和混淆我在構建TS代碼后得到的JS輸出。

我讀到GCC能夠根據類型定義進行混淆。 據我所知(如果我錯了請糾正我),這意味着如果我的代碼上有類型注釋,那么GCC將使用它們來進行更好的混淆。

例如,對於obj.someProp GCC當前在我的代碼中查找someProp屬性名稱的所有實例,而不考慮它所在的對象,並將所有這些實例替換為相同的混淆名稱(例如oa )。
但是如果我在我的代碼上有類型注釋,GCC將能夠知道哪個對象屬於哪種類型並相應地對其進行模糊處理 - 因此兩個不同類型的相同屬性名稱將被混淆為兩個不同的名稱。

問題:

  • 我理解正確嗎?
  • “類型安全”混淆是一件好事嗎?
    我的意思是,它有什么好處? 它似乎不會對生成的文件大小產生影響,甚至可能對gzip壓縮文件大小產生負面影響(因為不同類型的密鑰可能有更多不同)。
  • 我可以使用TypeScript以某種方式自動創建GCC注釋嗎?
    由於TS已經是類型安全的,我相信它是可能的,但我懷疑它是一個功能。 它可能需要TS編譯器內部的知識。 有什么見解嗎?

編輯

我其實剛發現這個這個 我會檢查出來並盡快發布更新。

更新

截至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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM