AMD模块中的动态导出

时间:2015-03-13 12:19:22

标签: javascript requirejs amd

AMD是否允许您定义导出为动态的模块,具体取决于其他模块?

我遇到的问题是define会立即返回,即使正文中有require次来电也是如此。这意味着,如果模块的定义依赖于其他模块,则任何依赖于它的模块都无法确定模块是否已满载,即使已满足相关性。

解释我的问题的一些代码:

// A module that exports one function 'f'. The implementation of this f comes
// from another module, dynamically selected based on a condition.
define("mymodule", function (require, exports) {
  var functionImplModule = someCondition ? "function-impl1" : "function-impl2";
  require([functionImplModule], function (functionImpl) {
    exports.f = functionImpl;
  });
});

// Entry point. I want to use module.f in some code.
require(["mymodule"], function (mymodule) {
  // Can't use mymodule.f here yet, because the require() of 'mymodule' isn't done yet
  console.log(mymodule.f);
});

这可以在AMD完成吗?或者这样的代码如何更好地构建?

1 个答案:

答案 0 :(得分:0)

我会在promise中返回exports

define("mymodule", function (require, exports) {
  var deferred = ..., functionImplModule = someCondition ? "function-impl1" : "function-impl2";
  require([functionImplModule], function (functionImpl) {
        deferred.resolve(functionImpl);
      });

  exports.f = deferred.promise;
});

// Entry point. I want to use module.f in some code.
require(["mymodule"], function (mymodule) {
   mymodule.f.then(function(impl) ... );
});

请注意您似乎也懒惰配置模块。这对捆绑和缩小不利。也许您可以使用您的配置更改用于mymodule的文件。