requirejs依赖项加载顺序不起作用

时间:2017-06-10 09:31:29

标签: javascript dependency-injection requirejs loader amd

我有这样的代码:

requirejs.config({
    urlArgs: "bust=" + (new Date()).getTime(),
    paths: {
        mods: 'default',
        myFriend: 'myFriend',
        myCoworker: 'myCoworker'
    },
    shim: {
        mods: ['myFriend', 'myCoworker']
    }
});
require(['mods'], function (mods) {
    // something to do
});

和作为依赖项的模块:

myFriend.js

var mess = `<a really huge text, almost 200 Kbytes>`
console.log('This code is ran in the myFriend module...', {mess:mess});

myCoworker.js

console.log('This code is ran in the myCoworker module...');
var wrk = {
    name: 'John'
};

所以我希望,相应的shim应该始终在myCoworker.js之前加载myFriend.js(由console.output检查)。但它并没有。控制台输出显示:

This code is run in the myCoworker module...

然后

This code is run in the myFriend module...

可能我错过了什么,但是什么?

整个代码在这里:http://embed.plnkr.co/zjQhBdOJCgg8QuPZ5Q8A/

1 个答案:

答案 0 :(得分:1)

您在处理RequireJS的工作方式时遇到了一个根本的误解。对于不调用shim的文件,我们使用define。使用shim使得RequireJS可以说,添加一种&#34;虚拟定义&#34;那些文件。你展示的垫片相当于:

define(['myFriend', 'myCoworker'], function (...) {...});

传递给definerequire调用的依赖项列表本身并未指定依赖项中列出的模块中的加载顺序 list。依赖列表唯一做的是指定在调用回调之前必须加载列表中的模块。这就是全部。

如果您希望首先加载myFriend,则需要myCoworker依赖它:

shim: {
    mods: ['myFriend', 'myCoworker'],
    myCoworker: ['myFriend'],
}

顺便说一下,shim实际上是用于你无法控制的代码。对于您自己的代码,您应该在代码中使用define,而不是在配置中设置shim