学习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
}
未完。。