學習seajs源碼前:app
1,異步加載js文件方法異步
var _script = document.createElement('script');函數
_script.onload = function(){學習
}ui
_script.src = src;spa
2,異步加載完成時,將自動執行JS文件內容prototype
3,問題1:如何得到js文件返回結果;隊列
解決:增長 define 方法 ,異步js文件加載完成時,將自動執行define方法ip
4,require('a'); 如何得到 a.js 文件返回的結果,或exportsget
解決: 改造 define 方法, 在define裏 將返回結果 存入 cacheMod 中
5, require('a'); 返回結果早於 a.js define方法的結果
同步得到返回結果時,require('a');得到的 cacheModes['a'].exports 爲空
需 define 執行後纔有值
基於上訴的一些問題,開始學習sea.js源碼 (V2.2.0)
首先是 sea.js 使用的 核心 Module.js
1,Module.requre方法
在這個方法裏 調用 Module.get方法
2 ,Module.get 方法
該方法中 調用 cacheModes[uri]以保證只會加載一次同一個模塊文件
若是cacheModes[uri] 不存在, 則會 建立一個新的 Module 類
3, Module.define 方法
該方法中,將保存id,依賴,及factory(回調方法)
期中 factory是重中之重。
4,Module.prototye.exec()
該方法也是Module極爲重要的一個方法。
該方法中,進行了模塊加載完成時的 factory方法的調用
原來的誤區,認爲require時 進行了 異步加載,同時繼續代碼繼續執行。
事實上,是在加載了全部 依賴 和 require 的js文件後 纔開始執行factory方法
即 在執行 require('a');時 a.js 已經加載完成
經過匹配factory的內容 找到require 的內容 在執行factory時,即加入加載隊列中
當全部隊列加載完畢時,開始依次執行回調函數 define = function(callback)
sea.js 流程(例子,只展示執行了的流程)
sea.use(['main'].function(main){});
Module.use = {
mod = cacheMods['main'] = new Module('main'); //mod.uri = 'main';
mod._entry.push(mod); //mod._entry = [mod] 該mod 即位自己
mod.callback = function(){
exports[0] = cacheMods['main'].exec();
callback.apply(global,exports);
}
mod.load();
}
Module.prototype.load = {
mod.status = STATUS.LOADING
}
未完。。