來自AMD設計思想的總結和思考es6
在以前瞭解es6模塊化的時候有遇到過依賴循環的問題,在es6中對於模塊是引用性的,而當時於es6模塊化作對比的commonjs(CMD規範)對於模塊是值類型(會將其緩存下來),因此面對循環依賴的時候,利用es6的模塊化機制並不會報錯。數組
// 裝載時依賴 define('a',function (require) { require('b').init(); })
運行時依賴,在模塊初始化的時候不須要,可是在後面運行的時候須要用到,這種依賴就是運行時依賴
// 運行時依賴 define('b',function(require)) { return { foo : require('b').foo(); } }
對於循環依賴,只要其中有一項採用對是運行時依賴則這個循環依賴就是‘合法’的。(這也是requirejs當中提倡的對於循環依賴的解決辦法)瀏覽器
咱們知道在define中咱們能夠將以來直接聲明到第二個參數裏(數組),也能夠利用require直接在須要時聲明(要將require做爲默認參數傳給factory),那麼當依賴前置的時候咱們如何判斷依賴方式?在咱們在第二個參數聲明瞭依賴以後,一般會將須要的用道(初始化)的模塊名看成參數傳入factory,當傳入的參數個數(length)於第二個參數中數組的length不相等時,咱們就會認爲它存在運行時依賴。緩存
The dependencies argument is optional. If omitted, it should default to [「require」, 「exports」, 「module」]. However, if the factory function’s arity (length property) is less than 3, then the loader may choose to only call the factory with the number of arguments corresponding to the function’s arity or length.less
存在的疑問:什麼是「用時定義」,暫時的理解:像commonjs那樣,使用模塊時進行require而後初始化,可是好像這個想法和異步加載是相悖的,後續再來學習。異步
esl是AMD規範下的一個應用,它是一個瀏覽器端、符合AMD的標準加載器,適合用於現代Web瀏覽器端應用的入口與模塊管理。模塊化
相比於Require:requirejs
前面有提到咱們聲明依賴的時候有兩種方式:性能
可是這兩種方式中模塊初始化的時機不一樣,須要注意:學習
當咱們使用第一種方式加載時,esl會像requirejs同樣去工做,依賴的模塊會提早初始化,可是這裏存在一種特殊狀況,當咱們不徹底將dependencies數組中的項傳入factory時,esl會這樣作
當factory的形式參數數目少於3時,loader能夠根據參數數量的前幾個dependencies模塊,去call factory。也就是說,dependencies數組裏,後面一些模塊的初始化時機,是能夠自由把握的;在call factory的時候,dependencies數組中位於形式參數length後面index的模塊,不必定要初始化完畢。
我的感悟:經過了解和學習,我的感受cmd規範像是amd的一個子集,而requirejs&seajs分別實現了amd規範的一部分,而esl是根據編寫的方式決定了初始化方案(按照requirejs仍是seajs)。