RequireJS配置

时间:2013-11-12 13:47:32

标签: requirejs uglifyjs r.js

我在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)? 感谢。

2 个答案:

答案 0 :(得分:1)

这是因为require的{​​{1}}是嵌套的并且可能是动态的;默认情况下,moduleB不会在输出中包含此类依赖项。要覆盖此默认行为,您可以将r.js设置为findNestedDependenciesexample 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,您需要稍微修改构建过程,请参阅示例(simplegrunt/bower)。


否则,您必须重组moduleB,不要求moduleA中的功能运行;它可能需要moduleA并自行运行这些功能。

另外,尝试从moduleA请求moduleB,这可以解决问题。