有没有办法在Require.js中定义全局依赖项?

时间:2014-03-19 00:20:19

标签: requirejs

背景故事:

我目前使用网站获得了Require.js和jQuery / Backbone.js。到目前为止,jQuery和Backbone都不在Require之外,让我这样做:

define([], function() {
    // NOTE: Using Backbone and $ without an import!
    new Backbone.View(el: $('#foo');
});

这非常有效:如果没有这种方法,我站点中的每个模块都必须添加Backbone / jQuery依赖项。

但是前几天我需要将一部分代码打包为外部库。我为它做了一个单独的require配置文件,一切看起来都很棒,直到我将所有文件编译(“优化”)到一个库文件中,并意识到Backbone / jQuery(以及相关的插件/库)不是'被包括在内。

所以,我添加了一堆垫片,并将Backbone,jQuery和所有相关库添加到Require中。但是,我仍然有大量模块希望$Backbone存在。那个应该可以,因为Backbone / jQuery都在全局注册它们的变量,但这不是因为Require的加载顺序。

基本上,任何没有依赖关系的模块都会被破坏,因为它们在Require加载jQuery / Backbone填充程序之前加载。任何具有依赖项的模块都没有这个问题,因为jQuery / Backbone在加载时已经被加载了。

似乎我唯一的选择是在没有依赖项的情况下为每个模块添加一个显式的Backbone / jQuery。我有很多这样的模块,理想情况下我不想在任何地方导入jQuery / Backbone。

问题

所以,我的问题是:有没有办法告诉要求“在加载其他所有内容之前加载这些X模块/填充程序”?或者,换句话说,有没有办法告诉要求我的所有模块都依赖于某些其他模块?

我认为将Backbone放在我最初要求的顶部:

require(['backbone', ...

但这没有帮助;其他无依赖模块仍然在它之前加载。

1 个答案:

答案 0 :(得分:6)

我认为没有理由不行:

require(['backbone', 'jquery'], function () {
    require(['main']);
});

我们的想法是在加载Backbone和jQuery的require调用中将您的初始入口点包装到您的应用程序中。 如果您的应用程序模块仅加载,因为main是必需的(也就是说,如果其他地方没有require调用则会加载任何模块需要main),然后使用Backbone和jQuery上面的代码保证在main使用的任何模块之前加载。