我在moduleA中有一个必须在加载moduleB之前运行的函数。 ModuleA不依赖于任何其他模块,而moduleB具有一些依赖性(例如moduleC)。以下代码执行它并在未优化时正常工作:
主要-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
这意味着只有3个模块 - require,moduleA和main-config - 一起被放大到1个最小化文件。输出文件中缺少所有moduleB的依赖项(例如moduleC)。
将配置文件更改为以下内容,将包含输出文件中所有moduleB的依赖项,但由于它在moduleA的init函数之前解析moduleB,因此无法获得所需的结果:
require(['moduleA','moduleB'], function (moduleA, moduleB) {
moduleA.init(function () {
moduleB.start();
});
});
我希望稍后解析moduleB,仅在moduleA的init函数之后(moduleB包含一些直接函数)。
如何将所有依赖树都包含在结果文件中,但是我需要的行为(在moduleA函数完成后解析并运行moduleB)? 感谢。
答案 0 :(得分:1)
这是因为require
的{{1}}是嵌套的并且可能是动态的;默认情况下,moduleB
不会在输出中包含此类依赖项。要覆盖此默认行为,您可以将r.js
设置为findNestedDependencies
(example buildconfig file中的更多详细信息)。
或者,如果您不想为整个项目更改此标志,并且只想为此单个依赖项设置例外,则可以将true
元素添加到buildconfig:
module
答案 1 :(得分:0)
我写的这个小项目有一种方法:require-lazy
你可以这样做:
require(['moduleA','lazy!moduleB'], function (moduleA, lazyModuleB) {
moduleA.init(function () {
lazyModuleB.get().then(function(moduleB) {
moduleB.start();
});
});
});
为了使用require-lazy,您需要稍微修改构建过程,请参阅示例(simple或grunt/bower)。
否则,您必须重组moduleB
,不要求moduleA
中的功能运行;它可能需要moduleA
并自行运行这些功能。
另外,尝试从moduleA
请求moduleB
,这可以解决问题。