seajs 源碼 學習心得

學習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

}


未完。。

相關文章
相關標籤/搜索