require循环依赖

     如果您定义了一个循环依赖项(“a”需要“b”和“b”需要“a”),那么在这种情况下,当“b”的模块函数被调用时,它将得到“a”的未定义值。“b”可以在模块被定义为使用require()方法之后获取“a”(请确保指定需要作为依赖项,以便使用正确的上下文查找“a”):

//Inside b.js:
define(["require", "a"],
    function(require, a) {
        //"a" in this case will be null if "a" also asked for "b",
        //a circular dependency.
        return function(title) {
            return require("a").doSomething();
        }
    }
);

    通常,您不需要使用require()来获取模块,而是依赖于将模块传递给函数作为参数。循环依赖是很少见的,通常是您可能想要重新考虑设计的标志。然而,有时它们是必需的,在这种情况下,使用require()如上所述。

    如果您熟悉CommonJS模块,则可以使用导出来为模块创建一个空对象,该对象可立即用于其他模块的引用。通过在循环依赖项的两边执行这个操作,您就可以安全地保留到另一个模块。这只有在每个模块向模块值导出对象时才有效,而不是函数:

//Inside b.js:
define(function(require, exports, module) {
    //If "a" has used exports, then we have a real
    //object reference here. However, we cannot use
    //any of "a"'s properties until after "b" returns a value.
    var a = require("a");

    exports.foo = function () {
        return a.bar();
    };
});

    或者,如果您正在使用依赖数组方法,请要求特殊的“导出”依赖项:

//Inside b.js:
define(['a', 'exports'], function(a, exports) {
    //If "a" has used exports, then we have a real
    //object reference here. However, we cannot use
    //any of "a"'s properties until after "b" returns a value.

    exports.foo = function () {
        return a.bar();
    };
});

原文链接:http://requirejs.org/docs/api.html#circular


猜你喜欢

转载自blog.csdn.net/github_37360787/article/details/79414856