require 遵循 AMD 規範,對依賴模塊進行異步加載,等待異步加載完成,再執行回調。
因此有以下好處:ajax
這裏不說 AMD 和 CMD,單純講講在requirejs運行的幾個關鍵點。app
怎麼去匹配一個模塊的呢 ?
require( [ 'a', 'b' ], callback )
a, b 就是咱們的 moduleId ;
id 和 path 之間有對應原則, 在 require 裏面用一個 Map 對象以鍵值對形式保存, 這樣加載器就能知道須要加載的路徑異步
拿到模塊的路徑,怎麼加載到頁面 ?
拿到路徑,就須要請求。經過 createElement('script') & appendChild 去請求。
固然也有可能有時會經過 ajax 去請求腳本內容。(ps: 何時會是 ajax 請求呢)
create 的 <script>
標籤會被 append 到頁面的 head 頭部。
同時會被打上兩個標記: data-requiremodule
& data-requirecontext
.
data-requiremodule : 用來標識模塊 id
data-requirecontext: 上下文環境函數
怎麼定義一個模塊,定義的模塊怎麼執行 ?
define( id?, dependencies?, factory )
當咱們 define(factory) 多個這樣的自定義匿名模塊時, 被加載進頁面, 怎麼知道當前是當前被定義的模塊呢?
剛纔說了每一個模塊都有一個 id , 那麼怎麼知道這個模塊的 id ?
經過 document.currentScript
獲取當前執行的 <script>
,
從而獲取到用於標識當前模塊的屬性 data-requiremodule
.
ps 兼容處理: 經過 script.onload
requirejs
依賴解析
require 遵循 AMD 規範, 當進入一個 define / require 時候, 先加載完依賴確保能使用後, 纔去執行 factory 回調, 併產出 export 接口(define).
那依賴是怎麼解析的出來的呢 ?
簡單的就是, 加載入口文件, 經過 toString()
得到函數內容, 再用正則去匹配 moduleId, 獲得子模塊。
若是子模塊還有依賴, 則會遞歸進行解析和加載 .ui