刚跟 @乱码 讨论了下seajs的加载原理, 做了下手记, 记下来... 啦啦啦
define添加到到seajs.cache里里#723 => 检测检测下依赖+返回值整个 #746 => 页面use触发(主入口,并留下回调埋点)#795 => 执行mod.load#813 => 分析所有依赖如果没有加载则加载#557 => fetch是加载js文件 => 如果全部加载完成执行mod.onload => onload负责运行回调(use里的埋点,CA又转回来了##798) => 回调里又运行所有依赖模块的exec#662 => exec里负责查看define的模块是是否被运行#668,如果没有运行则建立一个require的临时fn当param运行运行#677 并把返回结果打在mod的exports上上#704, 反返回给回调那那处理#710 #803, 这也是怎么能use([1,2,3],function(1,2,3){})的的原因 => 到这里已经加载完所有的依赖了,且拿到回调了#805 => 如果有callback还不运行等着干啥呢? #807
其实就一句话:
定义->缓存(依赖+整个fn)->use触发->判断依赖->判断所有依赖+js文件是否加载成功->判断每个模块的fn是否被运行->拿到每个模块的返回值->执行回调, 当然其中的心酸只有玉伯知道,比如 模块依赖模块,url解析 等... 那个提前预加载preload跟依赖相比就略显轻松了
注: 以上代码行号为2.2.1版本.