1

我在 moduleA 中有一个函数,必须在加载 moduleB 之前运行。ModuleA 不依赖于任何其他模块,而 moduleB 有一些依赖项(例如 moduleC)。以下代码在未优化时可以正常工作:

主配置.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 - 一起被 uglified 为 1 个最小化文件。输出文件中缺少 moduleB 的所有依赖项(例如 moduleC)。

将配置文件更改为以下内容,将在输出文件中包含 moduleB 的所有依赖项,但它不会得到所需的结果,因为它在 moduleA 的 init 函数之前解析 moduleB:

require(['moduleA','moduleB'], function (moduleA, moduleB) {
    moduleA.init(function () {
        moduleB.start();
    });
});

我希望稍后解析 moduleB,仅在 moduleA 的 init 函数之后(moduleB 包含一些立即函数)。

如何让所有依赖树包含在结果文件中,但具有我需要的行为(在 moduleA 的函数完成后解析并运行 moduleB)?谢谢。

4

2 回答 2

1

发生这种情况是因为requireformoduleB是嵌套的并且可能是动态的;默认情况下r.js不会在输出中包含此类依赖项。要覆盖此默认行为,您可以设置findNestedDependenciestrue示例 buildconfig 文件中的更多详细信息)。

或者,如果您不想为整个项目更改此标志,并且只想为这个单一依赖项创建一个例外,您可以将该module元素添加到您的 buildconfig:

modules: [{
    name: "main-config",
    // forces moduleB to be included
    include: ["moduleB"]
  },
  // ...
于 2013-11-12T14:43:11.820 回答
0

一种方法是使用我写的这个小项目:require-lazy

有了这个你会做:

require(['moduleA','lazy!moduleB'], function (moduleA, lazyModuleB) {
    moduleA.init(function () {
        lazyModuleB.get().then(function(moduleB) {
            moduleB.start();
        });
    });
});

为了使用 require-lazy,您需要稍微修改构建过程,请参阅示例(简单grunt/bower)。


否则,您将不得不重组moduleB以不要求moduleA运行其中的函数;它可能需要moduleA并自己运行这些功能。

也尝试要求moduleAmoduleB无论如何,这可以解决问题。

于 2013-11-12T14:33:37.297 回答