簡體   English   中英

使用 Require.js 動態加載模塊

[英]Load modules dynamically with Require.js

我正在嘗試按照本文開頭所述動態加載模塊:

參考鏈接

這是我的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 函數中的代碼永遠不會被執行,並且“加載模塊”永遠不會被打印到控制台。 此鏈接上閱讀了 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

如何從我正在加載的模塊訪問功能?

您應該使用定義指令:

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

為什么要以這種方式加載模塊? 您正在嘗試在循環內進行異步調用,基本上您每次都使用另一個 require 重寫“mod”變量,即使沒有 require 的異步調用返回某些內容。

// 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
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM