模塊化方案esl以及amd的依賴方式

來自AMD設計思想的總結和思考es6

  • 在以前瞭解es6模塊化的時候有遇到過依賴循環的問題,在es6中對於模塊是引用性的,而當時於es6模塊化作對比的commonjs(CMD規範)對於模塊是值類型(會將其緩存下來),因此面對循環依賴的時候,利用es6的模塊化機制並不會報錯。數組

    AMD中依賴的種類

  • 裝載時依賴,在模塊化初始階段久須要將依賴加載完成
    // 裝載時依賴 define('a',function (require) { require('b').init(); })
    這種方式加載模塊的時候須要b模塊初始化完成才能加載成功,若是b模塊也已這種方式依賴於a(或者以裝載時依賴的方式構成了一個循環)那麼這個循環就是死的(沒法成功加載)
  • 運行時依賴,在模塊初始化的時候不須要,可是在後面運行的時候須要用到,這種依賴就是運行時依賴
    // 運行時依賴 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

esl是AMD規範下的一個應用,它是一個瀏覽器端、符合AMD的標準加載器,適合用於現代Web瀏覽器端應用的入口與模塊管理。模塊化

相比於Require:requirejs

  • 體積更小
  • 性能更高
  • 更健壯
  • 不支持在非瀏覽器端使用
  • 依賴模塊「用時定義」(lazy define)

關於esl加載(初始化)模塊的方式

前面有提到咱們聲明依賴的時候有兩種方式:性能

  • 在dependencies中聲明,而後順序傳入factory中(這裏有特別狀況)
  • 不要dependencies,直接將require做爲參數傳入factory中,當須要某個模塊時直接require進來。

可是這兩種方式中模塊初始化的時機不一樣,須要注意:學習

  • 當咱們使用第一種方式加載時,esl會像requirejs同樣去工做,依賴的模塊會提早初始化,可是這裏存在一種特殊狀況,當咱們不徹底將dependencies數組中的項傳入factory時,esl會這樣作

    當factory的形式參數數目少於3時,loader能夠根據參數數量的前幾個dependencies模塊,去call factory。也就是說,dependencies數組裏,後面一些模塊的初始化時機,是能夠自由把握的;在call factory的時候,dependencies數組中位於形式參數length後面index的模塊,不必定要初始化完畢。

  • 當咱們使用第二種方式時,esl會像seajs同樣去工做,當咱們require一個模塊的時候它纔會去進行初始化,須要注意的是,若是requirejs以這種方式去加載依賴,它仍然會和原來同樣的方式去工做(提早初始化好)。
  • 我的感悟:經過了解和學習,我的感受cmd規範像是amd的一個子集,而requirejs&seajs分別實現了amd規範的一部分,而esl是根據編寫的方式決定了初始化方案(按照requirejs仍是seajs)。

相關文章
相關標籤/搜索