使用Require.js动态加载模块

时间:2014-01-27 10:57:06

标签: javascript jquery requirejs

我正在尝试动态加载模块,如本文开头所述:

Reference link

这是我的scripts/main.js

require.config({
  baseUrl: 'scripts',
  paths: {
    jquery: 'lib/jquery-2.0.3'
  },
  config: {
    'main': {
      modules: ['mod1', 'mod2', 'mod3']
    }
  }
});

require(function(require, exports, module) {
  console.log("Loading modules");
  require(module.config().modules);
});

当加载main.js时,外部require函数内的代码永远不会被执行,并且#34;加载模块"永远不会打印到控制台。在This link阅读了AMD文档后,我无法看到我做错了什么。动态加载在数组外部定义的模块的正确方法是什么?

谢谢!

更新

以下是我现在所拥有的:

// main.js
require.config({
  ...
  config: {
    'some_module': {
      modules: ['mod1']
    }
  }
});

require(['some_module'], function(some_module) {
});

// some_module.js
define(function(require, exports, module) {
  var mods = module.config().modules;

  var mod;
  for (var i=0; i < mods.length; i++) {
    mod = require(mods[i]);
    mod.fn_call();
  }
});

当我执行require(module.config().modules)时,mod1确实被加载了。我不知道如何使用require的返回值来调用mod1返回的函数。

通过上面的代码,我得到了

Uncaught Error: Module name "mod1" has not been loaded yet for context: _
http://requirejs.org/docs/errors.html#notloaded

如何从我正在加载的模块中访问这些功能?

2 个答案:

答案 0 :(得分:1)

您应该使用 define 指令:

define(function(require, exports, module) {
    console.log("Loading modules");
    require(module.config().modules);
});

通过RequireJS配置的 config 属性,您可以为每个模块定义配置。然后,在模块定义中,您可以访问该配置,在您的情况下加载依赖项。

在任何情况下,我认为您不需要将应用程序的主入口点作为AMD模块公开,因为它没有意义。它应该是这样的:

// some_module.js (or path for some_module alias)
define(function(require, exports, module) {
    require(module.config().modules);
    ...
    return function () {};
});

// main.js
require.config({
  ...
  config: {
    'some_module': {
      modules: ['mod1', 'mod2', 'mod3']
    }
  }
});

require('some_module'); // loads some_module, mod1, mod2, mod3

答案 1 :(得分:0)

为什么要以这种方式加载模块?你试图在一个循环中进行异步调用,基本上你每次用另一个需要重写你的“mod”变量,即使没有要求返回的异步调用。

// some_module.js
define(function(require, exports, module) {
  var mods = module.config().modules;

  var mod;
  for (var i=0; i < mods.length; i++) {
    mod = require(mods[i]);//your loop doesn't will wait for it...
    mod.fn_call();
  }
});

以这种方式加载你的模块,如果你想放置一些依赖项,你用config(http://requirejs.org/docs/api.html#config)来做,我没有看到任何理由不这样做......

define(['mod1', 'mod2', 'mod3'], function(mod1, mod2, mod3) {
         //do whatever you want with your modules
    });