再谈js拖拽(一)
seajs.js
断点查看:
一、Module.resolve里。得:
seajs.use -》 Module.preload -》Module.use 参数 data.cwd + "_preload_" + cid()为预加载模块设置一个默认uri
-> Module.prototype.load -> Module.prototype.resolve【遍历依赖】 -> Module.resolve 【后面这三步和上面“Module.prototype.load里函数解析”一样,我称其为加载模块3步骤 】
-> id2Uri -> addBase
在 Module.preload中Module.use的回调函数里 preloadMods.splice(0, len)可见预加载一个data.preload就少一个
在Module.resolve中 emit("resolve", emitData),这时还没有resolve对象,所以不触发什么。
addBase中:
data.base(var)-> loaderDir(var) -> loaderScript(var)
以seajsnode为节点或最后一个script节点作为加载的根路径
二、Module.preload / Module.use回调函数中:
到此的过程: addOnload 的 -> onRequest -> Module.prototype.load -> Module.use -> Module.preload
问题1、谁触发node.onload? 答:ajax事件(系统)。
问题2、如何到addOnload来注册回调函数? 答:从上面的执行过程大概可以看得出是回调函数被执行而展开的,即onRequest,
继续找,有两处有此回调函数的钩子:emit("request"。。和 function sendRequest。。,那么是那个呢?
只能分别辨析了。
上Module.prototype.onload 中从等待列表中递归调 onload . 模块依赖的模块个数记录在其_waitings属性中,
等所有依赖模块都加载完之后才能加载本模块