2014-07-03 125 views
5

我一直在readingaboutes6 module loaders我只是不太明白它是如何工作的,我希望有人能夠啓發我。es6模塊如何加載工作

在實際的工作流程鏈接上面,他們有這樣的

System.import('app/app').then(function(app) { 
    // app is now the Module object with exports as getters 
}); 

與沒有問題的例子 - 我明白了。但後來我看到這樣的東西

var $ = require('jquery'); 

並得到真正困惑。如果在這次調用時jquery還沒有傳輸到瀏覽器會發生什麼?線程是否旋轉?瀏覽器是否在幕後解析你的腳本並將它改造成像RequireJs這樣的回調?它是可配置的?有特定的限制嗎?

有人可以給我一個破敗?

+1

您看到的第二件事是「CommonJS模塊加載」,而不是ES6 afaik。它確實[在require.js中不工作(很好)](http://requirejs.org/docs/api.html#cjsmodule) – Bergi

+0

@Bergi它在require.js中正常工作,而我不喜歡它我當前項目中的某些頁面使用requirejs和commonjs風格。 Requirejs掃描腳本中的commonjs表達式並將其重寫爲amd格式,因此它仍然使用回調函數。但是,除非我錯了,否則es6建議不會使用回調 - 因此我很困惑。 –

+0

是的,除了最簡單的情況外,掃描腳本並不適用於所有情況。你能鏈接你所說的ES6提案的部分嗎? 'System.import'顯然使用回調。 – Bergi

回答

4

ES6模塊加載器將獲取源代碼,確定依賴關係,並在執行模塊之前等待這些依賴項已經加載。所以在require執行的時候,依賴關係已經在那裏等待執行了。

當通過ES6模塊加載器加載CommonJS時,我們依賴從源靜態解析出require語句,並且只有在需要加載的時候才執行源代碼。

這樣我們可以在瀏覽器中動態加載CommonJS。循環引用的處理方式與在Node中處理的方式相同。

解析出require的正則表達式實際上非常可靠和快速,同時考慮了註釋和周圍的令牌。 SystemJS使用的一個請參見https://github.com/systemjs/systemjs/blob/master/lib/extension-cjs.js#L10

這種方法還有一個限制,那就是動態條件CommonJS需要像if (condition) require('some' + 'name')那樣檢測不到。儘管使CommonJS在瀏覽器中表現爲完全異步模塊格式,但這是一個必要的成本。

+1

我寫了這個問題後的一段時間,我們得到了[關於es6模塊的這篇文章](http://www.2ality.com/2014/09/es6-modules-final.html)。它直接違背了你所說的一些東西(例如,正則表達式解析,循環依賴關係的工作方式以及動態需求的可用性)。看起來我的一些混淆至少是模塊和模塊加載器是獨立的規格,只有前者是完整的。 –

+2

的ES6模塊加載器有兩種方式來解釋模塊:通過被稱爲「實例化」鉤 1. ES6模塊 2.舊模塊格式 我們所用的傳統模塊格式建立到ES6模塊加載器。 你是對的 - ES6模塊加載也有其自己的循環引用樣式,這與CommonJS不同。 將CommonJS支持寫入加載器時,可以允許完全CommonJS樣式的循環引用支持。 就規格而言,模塊加載器類行爲本身在ES6規範中,單獨的規範是什麼是確切的環境掛鉤。 – guybedford