一、requirejs初始化执行流程
 
1 if (isBrowser)
2 req(cfg)
3 context.configure()
4 context.require(cfg.deps || [], cfg.callback)
5 resume()
6 req.load
7 req.attach(url, context, moduleName);
 
二、require()细节
 
1 可通过require.config方法配置baseUrl
2 文件名一般不用加".js",如果有".js"文件一定是与引入requirejs的html在同一个目录
 
 
三、够狠,一个newContext方法,有1k多行
 
四、require流程
 
1 require([xx], fn)
2 context.require(deps, callback, relModuleMap)
3 main(null, deps, callback, relModuleMap);
4 makeModuleMap(depArg, (name ? moduleMap : relModuleMap)) 每次调用生成 module对象
{
prefix:
name:
parentMap:
url:
originalName:
fullName:
}
5 getManager(map, shouldQueue) 生成的manager结构如下
manager = {
id:
map: map, // 为上面makeModuleMap结构
depCount: 0,
depDone: [],
depCallbacks: [],
deps: [],
listeners: [],22722
add: managerAdd
};
6 resume()
7 req.load(context, fullName, url);
8 req.attach(url, context, moduleName);
9 req.addScriptToDom(node);
 
callback
1 req.onScriptLoad
2 context.completeLoad(moduleName);
3 callDefMain
4 main(name, deps, callback)
5 execManager(manager)
6
 
五、configurePackageDir函数在context.configure调用。即配置requirejs时。
 
六、context.defined 中存储各个模块
 
 
十、瑕疵
1 requirejs/define/resume 多余的 return undefined
2 req.execCb 多余的参数name
3 forceExec/checkLoaded return undefined 改为 return; 最后的return undefined去掉
 
 
十一、剃掉的
1 isBrowser 非浏览器环境的支持
2 r.js 相关代码
3 requireWait 标示符 / 佳璐说是模拟script的load
4 queueDependency 内仅一行,仅被调用一次(getManager中)
 posted on 2012-04-13 17:57 落叶满长沙 阅读(...) 评论(...) 编辑 收藏