Javascript RequireJS依赖顺序

Javascript RequireJS依赖顺序,javascript,requirejs,Javascript,Requirejs,如果您有这样一个RequireJS模块: define( [ '#patches', 'backbone', 'underscore', 'react', '#allCollections', '#allModels', 'app/js/routers/router', '#allTemplates', '#allControllers',

如果您有这样一个RequireJS模块:

define(
    [
        '#patches',
        'backbone',
        'underscore',
        'react',
        '#allCollections',
        '#allModels',
        'app/js/routers/router',
        '#allTemplates',
        '#allControllers',
        '#allRelViews'
    ],

function(){

   var patches = arguments[0];

});
有没有办法知道先加载哪个依赖项?在我的例子中,#patches是一些window.X实用程序函数,我想先加载它们。我是否需要以不同的方式进行配置以确保这一点

(在我的例子中,“#”只是我自己的符号,表示路径在我的主配置文件中预定义的模块)

来自文档:

“RequireJS等待加载所有依赖项,确定调用定义模块的函数的正确顺序,然后在调用这些函数的依赖项后调用模块定义函数。请注意,由于子依赖关系和网络负载顺序,给定模块定义函数的依赖项可以按任何顺序调用。”

我认为这可能会有所帮助:(请参阅“管理从属文件的顺序”)

RequireJS使用异步模块加载(AMD)用于加载文件。每个依赖模块将以给定顺序通过异步请求开始加载。即使考虑了文件顺序,由于异步性质,我们也不能保证第一个文件在第二个文件之前加载。因此,RequireJS允许我们使用shim配置来定义需要o以正确的顺序加载。让我们看看如何在RequireJS中创建配置选项

requirejs.config({
  shim: {
    'source1': ['dependency1','dependency2'],
    'source2': ['source1']
  }
});
希望能有帮助

编辑:如评论中所述,对AMD模块使用垫片是一个坏主意,只对非AMD模块使用垫片,并在那里管理依赖项顺序。 对于AMD模块,requirejs将管理加载顺序。
来自评论的好链接(感谢Daniel Tulp)==>

就像弗朗索瓦·理查德(François Richard)已经说过的那样,可以影响依赖项隐式加载的顺序,但我不建议将此作为最佳实践。通常的做法是每个依赖项本身都声明它的依赖项,因此如果您的
#allRelViews
需要窗口实用程序,它应该声明这一点在它的
define
调用中。如果您无法控制依赖关系,我建议您使用已接受的答案中建议的垫片方法-我看到的唯一其他方法是修改源代码,但您必须在库的每次更新中都这样做。主干线和下划线符合AMD。(它们调用
定义
)如果您自己的模块也调用了
define
,那么您在问题中显示的大多数模块都不能与您接受的答案一起使用,因为
shim
仅对非AMD模块具有已定义的行为。如果您对调用
define
的模块使用
shim
,则结果未定义。(当我尝试它时,它通常被忽略,但因为它没有语义,所以RequireJS可以自由地从一个版本更改到下一个版本。它就像C中未初始化的指针:无法保证它得到什么值。)对于实际的AMD模块有什么解决方案吗?@Patrick在您的require.js配置中使用shim,正如公认的答案所说;虽然显然只适用于非AMD模块?这似乎很奇怪,但我想是这样。另一种更为粗暴的方法是嵌套require调用,如so
require('x',function(x){require('y',function(){require require('z',函数(z){}})
因此,您可以通过使用垫片选项来保证一定的加载顺序。如果顺序重要,我认为应该将其分组到更多模块中,而不是垫片中。需要排序将要求定义的模块了解有关每个所需模块的信息,这将更难重用。
shim
仅适用于非AMD模块。放置
AMD模块的垫片
配置会导致未定义的行为。OP使用主干和下划线,这两个模块都是AMD模块(并且已经存在一段时间),因此您不能对它们使用垫片。:记住:仅对非AMD脚本使用垫片配置,这些脚本尚未调用define()。如果在AMD脚本上使用,垫片配置将无法正常工作,尤其是导出和初始化配置将不会被触发,并且deps配置在这些情况下会令人困惑。@AlexanderMills我没有对他投反对票,只是消息,这里有一些关于它的更多信息: