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.