AMD 模块中的动态导出

Dynamic exports in an AMD module

本文关键字:动态 模块 AMD      更新时间:2023-09-26

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

我遇到的问题是,即使体内有require呼叫,define也会立即返回。这意味着,如果模块的定义依赖于其他模块,则任何依赖于它的模块都无法确定模块已完全加载,即使满足了依赖关系也是如此。

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

// 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 中完成吗?或者这样的代码如何更好地结构化?

我会在你的exports中返回一个promise.

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的文件。