【问题标题】:Dynamic exports in an AMD moduleAMD 模块中的动态导出
【发布时间】:2015-03-13 12:19:22
【问题描述】:

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

【问题讨论】:

  • 如果我的解释正确,您使用的是Simplified CommonJS wrapping sugar,它依赖于解析您的源代码的魔法,必然做出简单的假设,并且与动态依赖项不兼容。如果你用更直接的 AMD 方式重写你的定义:define([someCondition ? "function-impl1" : "function-impl2"], function(functionImpl) {return {f:functionImpl};}) 这假设你的someCondition 不依赖于 mymodule 的依赖项;如果它是依赖的,你可以添加它作为澄清。

标签: javascript requirejs amd


【解决方案1】:

我会在您的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 的文件。

【讨论】:

  • 谢谢。回调/承诺是我的后备计划,我想我希望有一些更优雅的内置功能,特别是因为它是为异步加载而构建的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 2016-04-28
  • 2017-04-24
  • 2013-03-05
  • 1970-01-01
相关资源
最近更新 更多