国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

seajs1.3.0源碼解析之module依賴有序加載

2024-05-06 14:20:59
字體:
來源:轉載
供稿:網友

這里是seajs loader的核心部分,有些IE兼容的部分還不是很明白,主要是理解各個模塊如何依賴有序加載,以及CMD規范。

代碼有點長,需要耐心看:

代碼如下:
/**
* The core of loader
*/
;(function(seajs, util, config) {
// 模塊緩存
var cachedModules = {}
// 接口修改緩存
var cachedModifiers = {}
// 編譯隊列
var compileStack = []
// 模塊狀態
var STATUS = {
'FETCHING': 1, // The module file is fetching now. 模塊正在下載中
'FETCHED': 2, // The module file has been fetched. 模塊已下載
'SAVED': 3, // The module info has been saved. 模塊信息已保存
'READY': 4, // All dependencies and self are ready to compile. 模塊的依賴項都已下載,等待編譯
'COMPILING': 5, // The module is in compiling now. 模塊正在編譯中
'COMPILED': 6 // The module is compiled and module.exports is available. 模塊已編譯
}


function Module(uri, status) {
this.uri = uri
this.status = status || 0

// this.id is set when saving
// this.dependencies is set when saving
// this.factory is set when saving
// this.exports is set when compiling
// this.parent is set when compiling
// this.require is set when compiling
}


Module.prototype._use = function(ids, callback) {
//轉換為數組,統一操作
util.isString(ids) && (ids = [ids])
// 使用模塊系統內部的路徑解析機制來解析并返回模塊路徑
var uris = resolve(ids, this.uri)

this._load(uris, function() {
// Loads preload files introduced in modules before compiling.
// 在編譯之前,再次調用preload預加載模塊
// 因為在代碼執行期間,隨時可以調用seajs.config配置預加載模塊
preload(function() {
// 編譯每個模塊,并將各個模塊的exports作為參數傳遞給回調函數
var args = util.map(uris, function(uri) {
return uri ? cachedModules[uri]._compile() : null
})

if (callback) {
// null使回調函數中this指針為window
callback.apply(null, args)
}
})
})
}

// 主模塊加載依賴模塊(稱之為子模塊),并執行回調函數
Module.prototype._load = function(uris, callback) {
// 過濾uris數組
// 情況一:緩存中不存在該模塊,返回其uri
// 情況二:緩存中存在該模塊,但是其status < STATUS.READY(即還沒準備好編譯)
var unLoadedUris = util.filter(uris, function(uri) {
return uri && (!cachedModules[uri] ||
cachedModules[uri].status < STATUS.READY)
})

var length = unLoadedUris.length
// 如果length為0,表示依賴項為0或者都已下載完成,那么執行回調編譯操作
if (length === 0) {
callback()
return
}

var remain = length

for (var i = 0; i < length; i++) {
// 閉包,為onFetched函數提供上下文環境
(function(uri) {
// 創建模塊對象

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 沧源| 通江县| 巴马| 慈利县| 年辖:市辖区| 和田市| 铜山县| 昌都县| 徐州市| 合作市| 民乐县| 和平区| 仪征市| 松阳县| 繁峙县| 新巴尔虎左旗| 株洲县| 宁德市| 股票| 石阡县| 天祝| 丰顺县| 彰化县| 扶风县| 黑山县| 贵溪市| 玉林市| 行唐县| 临沂市| 仙桃市| 若羌县| 临洮县| 梁河县| 亚东县| 昭觉县| 那曲县| 曲周县| 安乡县| 台东县| 林口县| 昌平区|