这篇主要讲最后的seajs源码运行顺序。当然,前面那些零零碎碎的就直接忽略了,就从module那块开始
seajs总的函数调用顺序图如下:
seajs.use调用后会调用Module.preload,如果有预加载模块的话,就需要先调用Module.use(preloadMods,function(){..},...),来完成模块的预加载,在其完成后再正式调用Module.use(ids,...)
mod.load中的resolve函数主要是将mod所依赖的一系列文件路径都计算出来,然后形成数组返回。在load通过循环,逐个的用Module.get得到module实例,然后通过fetch,调用seajs.request得到该文件并执行,由于得到的js文件的话一般有define包裹,define的作用是将factory函数解析,判断其依赖的项目,然后添加的m实例的依赖下,在后面的m.load运行时,就会将这些依赖项目抓取过来,若依赖项目中还有依赖,就会再次进入解析-正则匹配-添加依赖-load抓取。
在一起依赖都完成时,就会执行m.onload函数,这个函数在最后会对依赖这个m的module进行逐一检查,分别减去他们的_remain,并判断remain是否等于0,若等于0,就对这个mod执行mod.onload函数。
在最后的onload函数中,将每个依赖的js都进行执行,这是的exec函数会将原来拿到的js文件中产生的module下的factory进行运行,返回的对象会放在exports下,在最后通过callback.apply(global,exports)来将前面得到的对象作为函数参数传入。
博客地址:http://www.cnblogs.com/cyITtech/