理解requirejs的幾個重要點

require 遵循 AMD 規範,對依賴模塊進行異步加載,等待異步加載完成,再執行回調。
因此有以下好處:ajax

  • 天生異步
  • 依賴容易被識別
  • 避免全局變量
  • 若是須要能夠懶加載
  • 容易管理和組織代碼

這裏不說 AMD 和 CMD,單純講講在requirejs運行的幾個關鍵點。app

  1. 怎麼去匹配一個模塊的呢 ?
    require( [ 'a', 'b' ], callback ) a, b 就是咱們的 moduleId ;
    id 和 path 之間有對應原則, 在 require 裏面用一個 Map 對象以鍵值對形式保存, 這樣加載器就能知道須要加載的路徑異步

  2. 拿到模塊的路徑,怎麼加載到頁面 ?
    拿到路徑,就須要請求。經過 createElement('script') & appendChild 去請求。
    固然也有可能有時會經過 ajax 去請求腳本內容。(ps: 何時會是 ajax 請求呢)
    create 的 <script> 標籤會被 append 到頁面的 head 頭部。
    同時會被打上兩個標記: data-requiremodule & data-requirecontext .
    data-requiremodule : 用來標識模塊 id
    data-requirecontext: 上下文環境函數

  3. 怎麼定義一個模塊,定義的模塊怎麼執行 ?
    define( id?, dependencies?, factory )
    當咱們 define(factory) 多個這樣的自定義匿名模塊時, 被加載進頁面, 怎麼知道當前是當前被定義的模塊呢?
    剛纔說了每一個模塊都有一個 id , 那麼怎麼知道這個模塊的 id ?
    經過 document.currentScript 獲取當前執行的 <script>,
    從而獲取到用於標識當前模塊的屬性 data-requiremodule .
    ps 兼容處理: 經過 script.onloadrequirejs

  4. 依賴解析
    require 遵循 AMD 規範, 當進入一個 define / require 時候, 先加載完依賴確保能使用後, 纔去執行 factory 回調, 併產出 export 接口(define).
    那依賴是怎麼解析的出來的呢 ?
    簡單的就是, 加載入口文件, 經過 toString() 得到函數內容, 再用正則去匹配 moduleId, 獲得子模塊。
    若是子模塊還有依賴, 則會遞歸進行解析和加載 .ui

相關文章
相關標籤/搜索