学习seajs源码前:
1,异步加载js文件方法
var _script = document.createElement('script');
_script.onload = function(){
}
_script.src = src;
2,异步加载完成时,将自动执行JS文件内容
3,问题1:如何获得js文件返回结果;
解决:增加 define 方法 ,异步js文件加载完成时,将自动执行define方法
4,require('a'); 如何获得 a.js 文件返回的结果,或exports
解决: 改造 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
}
未完。。