| 一、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
浙公网安备 33010602011771号