analysis of requirejs - PuZheng/PuZheng-Docs GitHub Wiki
模块, 而不是脚本是require.js的核心概念。require.js根据代码中指定的依赖(通过define依赖)去加载模块,
1. 如果这个模块已经被注册,即如下面的代码:
define("moduleName", ['dep1', 'dep2'], function () {
var exportedObj = ...
return exportedObj;
});
已经被浏览器执行加载过。 那么去执行define函数的第三个参数,去取得exportedObj. 这一步称之为导入。
2. 如果这个模块没有被注册过,根据require.config.path,去异步加载模块所对应的 脚本,注册模块, 并且去执行define函数的第三个参数,这就是AMD本身的含义。 这里有个例外, 就是那些不支持AMD的模块, 比如很多jquery的插件, 若shim过了, require.js会异步加载其依赖模块, 并且将指定的名称export出来。例如:
// a-cnt.js
var aCnt = function (container) { return $(container).find('a').html(); };
如果A对应的shim是:
'a-cnt': {
deps: ['jquery'],
export: "aCnt",
}
那么就相当于注册了这么一个模块(但实际上还有另外一种情况, 分析脚本优化问题的时候, 会进一步说明这个问题):
define("a-cnt", ['jquery'] (function (global) {
return function () {
var ret, fn;
return ret || global.aCnt;
};
}(this)));
当然a-cnt.js已经被加载执行过了, 这样才能有window.aCnt.