許多JavaScript庫都有一個Builder工具,它可以讓您「塑造」您所依賴的庫的功能,無論是下載到客戶端的帶寬成本,還是您實際需要的隔離功能。AMD模塊調整:如何只加載一個JS函數?
比如,我喜歡在sugar.js很多事情,但我根本不需要或不想要平假名和片假名字符集的處理。作爲最微不足道的示例,我希望能夠「塑造」sugar.js以僅導出string.isBlank()。
有沒有工具可以爲我做這個? EcmaScript委員會有沒有在未來的JavaScript版本中做這樣的工作?像TypeScript和CoffeeScript這樣的更高級的語言對這種「塑造」提供隱藏的支持嗎?我可以通過monolinker在C#中爲.NET DLL做這樣的「整形」。
基本上,它看起來對我來說,AMD處理一個現代編譯器的加載方面,但不處理鏈接的方面。 jquery和dojo的構建器僅適用於特定的模塊,並不是真正的鏈接器,只是構建器。
更新:Google Closure Compiler是一種編譯器,它將JavaScript作爲輸入並生成JavaScript作爲輸出。該Advanced Compilation and Externs文檔建議有一個API調用來做到這一點:
如果放在一起,這些出口語句顯得過於繁瑣,可以用一個函數來做到出口爲您服務。有關導出函數的示例,請參見Closure Library函數goog.exportSymbol()和goog.exportProperty()。
但是,這看起來相當複雜,並使我直接依賴Google Closure Compiler。在這一點上,我正在尋找關於EcmaScript委員會未來標準的信息,關於CommonJS以及任何想到這個問題並試圖解決這個問題的人的智慧。特別是來自TypeScript開發人員;我不想在TypeScript中爲sugar.js創建聲明文件,然後對我的TypeScript編譯器輸出使用Google Closure Compiler。這聽起來很複雜,很難調試。
這是一個很好的問題。我不認爲任何工具都可以自動完成。 JavaScript非常靈活,在運行時或者應用程序的狀態中看到函數發生變化並不罕見......可能很難真正提取一個函數。所以,我現在可以向你保證,如果原作者沒有內置該選項,那麼你不能使用鏈接器僅從jQuery中獲取'$ .each'。這可能會來嗎?也許,但我不會在不久的將來看到它。 (也許現在在靜態分析工具上完成的工作將有助於以這種方式進行) – 2013-04-25 14:31:10
這就是我所懷疑的。我已經看到MS Research的Allen Wirfs-Brock和Nikolai Tillman給出了一些例子,根據*解釋時*的變量類型,6行JS代碼塊可以有不同的含義。因此,爲什麼我還詢問了TypeScript和其他支持可選鍵入的高級語言。謝謝! – 2013-04-25 15:04:38
這裏是Nikolai的例子,摘自他在VMIL 2010上的SPUR演講(http://www.cs.iastate.edu/~design/vmil/2010/slides/p03-tillmann-slides.pdf) var sum = 0; 爲(VAR I = 0; I <1000;我++){ 如果(I == 990){ 總和+ = 「Hello World」 的 } 總和+ = 1 } 打印(總和) – 2013-04-25 15:06:23