我在moduleA中有一个函数,它必须在加载moduleB之前运行。ModuleA不依赖于任何其他模块,moduleB也有一些依赖项(例如moduleC)。下面的代码可以在没有优化的情况下正常工作:
main-config.js
require.config({
paths: {
moduleA: 'modules/moduleA',
moduleB: "modules/moduleB",
moduleC: "modules/moduleC",
}
});
require(['moduleA'], function (moduleA) {
moduleA.init(function () {
require(['moduleB'], function (moduleB) {
moduleB.start();
});
});
});然而,当使用r.js对其进行优化时,事情会变得一团糟。r.js优化器的输出是:
Tracing dependencies for: ../scripts/main-config
Uglifying file: C:/.../scripts/main-config.js
C:/.../scripts/main-config.js
----------------
C:/.../scripts/libs/require/require.js
C:/.../scripts/modules/moduleA.js
C:/.../scripts/main-config.js这意味着只有三个模块-- require、moduleA和main-config --一起被丑化为一个最小化的文件。输出文件中缺少所有moduleB的依赖项(如moduleC)。
将配置文件更改为以下内容,将在输出文件中包含所有moduleB的依赖项,但它不会获得所需的结果,因为它在moduleA的init函数之前解析moduleB:
require(['moduleA','moduleB'], function (moduleA, moduleB) {
moduleA.init(function () {
moduleB.start();
});
});我希望稍后解析moduleB,只在moduleA的init函数之后(moduleB包含一些直接函数)。
如何使所有依赖树都包含在结果文件中,但通过我所需的行为(在moduleB函数完成后解析和运行moduleA )?谢谢。
发布于 2013-11-12 14:43:11
这是因为require for moduleB是嵌套的,并且可能是动态的;默认情况下,r.js不会在输出中包含这样的依赖项。若要覆盖此默认行为,可以将findNestedDependencies设置为true (示例buildconfig文件中有更多详细信息)。
或者,如果您不想为整个项目更改此标志,并且只想为此单个依赖项设置一个异常,则可以将module元素添加到您的buildconfig中:
modules: [{
name: "main-config",
// forces moduleB to be included
include: ["moduleB"]
},
// ...发布于 2013-11-12 14:33:37
一种方法是使用我写的这个小项目:要求-懒惰
有了这个,你就会:
require(['moduleA','lazy!moduleB'], function (moduleA, lazyModuleB) {
moduleA.init(function () {
lazyModuleB.get().then(function(moduleB) {
moduleB.start();
});
});
});为了使用require lazy,您将需要稍微修改构建过程,请参阅示例(简单或咕噜/鞠躬)。
否则,您将不得不重构moduleB,使其不需要运行moduleA中的函数;它可能需要moduleA并自行运行这些函数。
另外,尝试要求moduleA从moduleB无论如何,这可以解决问题。
https://stackoverflow.com/questions/19930897
复制相似问题