2013-04-25 57 views
11

許多JavaScript庫都有一個Builder工具,它可以讓您「塑造」您所依賴的庫的功能,無論是下載到客戶端的帶寬成本,還是您實際需要的隔離功能。AMD模塊調整:如何只加載一個JS函數?

比如,我喜歡在sugar.js很多事情,但我根本不需要或不想要平假名和片假名字符集的處理。作爲最微不足道的示例,我希望能夠「塑造」sugar.js以僅導出string.isBlank()。

有沒有工具可以爲我做這個? EcmaScript委員會有沒有在未來的JavaScript版本中做這樣的工作?像TypeScript和CoffeeScript這樣的更高級的語言對這種「塑造」提供隱藏的支持嗎?我可以通過monolinker在C#中爲.NET DLL做這樣的「整形」。

基本上,它看起來對我來說,AMD處理一個現代編譯器的加載方面,但不處理鏈接的方面。 jquerydojo的構建器僅適用於特定的模塊,並不是真正的鏈接器,只是構建器。

更新: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。這聽起來很複雜,很難調試。

+0

這是一個很好的問題。我不認爲任何工具都可以自動完成。 JavaScript非常靈活,在運行時或者應用程序的狀態中看到函數發生變化並不罕見......可能很難真正提取一個函數。所以,我現在可以向你保證,如果原作者沒有內置該選項,那麼你不能使用鏈接器僅從jQuery中獲取'$ .each'。這可能會來嗎?也許,但我不會在不久的將來看到它。 (也許現在在靜態分析工具上完成的工作將有助於以這種方式進行) – 2013-04-25 14:31:10

+0

這就是我所懷疑的。我已經看到MS Research的Allen Wirfs-Brock和Nikolai Tillman給出了一些例子,根據*解釋時*的變量類型,6行JS代碼塊可以有不同的含義。因此,爲什麼我還詢問了TypeScript和其他支持可選鍵入的高級語言。謝謝! – 2013-04-25 15:04:38

+0

這裏是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

回答

2

不幸的是,沒有什麼內置的Javascript做到這一點「塑造」的,和你真正想要的是一個編譯器,無論如何,因爲大致它所服務的角色之一是自動「塑造」在許多層面(而不僅僅是與方法)。 Closure編譯器是成熟的開源(JQuery實際上是使用Closure編譯器進行縮減)。所以如果你打算開始爲編譯器註釋你的JS代碼,那它可能就是這個。

有很多使用編譯器的副作用,順便說一句。它們會減少文件大小(從而減少解釋/運行時間),而不僅僅是簡化包含的庫。在開發過程中,它會提供很多有用的信息來儘早發現錯誤。

相關問題