使用RequireJs按特定顺序加载文件

时间:2012-07-20 14:44:11

标签: requirejs

我是RequireJS的新手,我一直坚持加载订单。

我有一个全局项目配置,我需要在js / app /*中的模块之前加载。

这是我的结构:

index.html
config.js
js/
    require.js
    app/
        login.js
    lib/
        bootstrap-2.0.4.min.js

这是config.js文件:

var Project = {
    'server': {
        'host': '127.0.0.1',
        'port': 8080
    },
    'history': 10,      // Number of query kept in the local storage history
    'lang': 'en',       // For future use
};

这是我的requirejs文件(app.js):

requirejs.config({
    //By default load any module IDs from js/lib
    baseUrl: 'js/lib',
    //except, if the module ID starts with "app",
    //load it from the js/app directory. paths
    //config is relative to the baseUrl, and
    //never includes a ".js" extension since
    //the paths config could be for a directory.
    paths: {
        bootstrap: '../lib/bootstrap-2.0.4.min',
        app: '../app',
    },
    shim: {
        'app': {
            deps: ['../../config'],
            exports: function (a) {
                console.log ('loaded!');
                console.log (a);
            }
        } // Skual Config
    },
});

var modules = [];
modules.push('jquery');
modules.push('bootstrap');
modules.push('app/login');


// Start the main app logic.
requirejs(modules, function ($) {});

但是有时候,当我加载页面时,我的“项目”是未定义的,因为在.config.js之前加载了login.js。

我怎样才能强制首先加载config.js,无论如何?

注意:我看到order.js是RequireJS的一个插件,但是自v2以来它显然不受支持,取而代之的是shim

感谢您的帮助!

3 个答案:

答案 0 :(得分:26)

今天遇到类似的问题 - 我们想要确保在其他任何事情之前加载的引导数据,并且在评估任何其他模块之前设置暴露该数据的模块。

我发现强制加载顺序的最简单的解决方案是在继续应用初始化之前简单地要求加载模块:

require(["bootstrapped-data-setup", "some-other-init-code"], function(){
    require(["main-app-initializer"]);
});

答案 1 :(得分:20)

有一种可能的解决方案来为要加载的模块构建队列。在这种情况下,所有模块将按照确切的顺序逐个加载:

var requireQueue = function(modules, callback) {
  function load(queue, results) {
    if (queue.length) {
      require([queue.shift()], function(result) {
        results.push(result);
        load(queue, results);
      });
    } else {
      callback.apply(null, results);
    }
  }

  load(modules, []);
};

requireQueue([
  'app',
  'apps/home/initialize',
  'apps/entities/initialize',
  'apps/cti/initialize'
], function(App) {
  App.start();
});

答案 2 :(得分:15)

如果将js文件定义为AMD模块,则无需担心加载顺序。 (或者,如果您无法修改config.jslogin.js来调用define,则可以使用填充配置。

config.js看起来像这样:

define({project: {
    'server': {
        'host': '127.0.0.1',
        'port': 8080
    },
    'history': 10,      // Number of query kept in the local storage history
    'lang': 'en',       // For future use
}});

login.js:

define(['jquery', '../../config'], function($, config) {

    // here, config will be loaded
    console.log(config.project)

});

同样,只有在模块内部调用define()不是一个选项时,才应使用shim config。