【发布时间】: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