require.js模块可以依赖于自身

时间:2013-07-10 16:25:44

标签: javascript requirejs

我们有两个模块可以通过require.js加载(使用'define'):

  1. ds.test.js
  2. ds.js
  3. 正如您可能猜到的,前者测试后者。 ds.test.js的序言如下,我添加了一些控制台/日志记录:

    define(["ds", "test", "assert"], function (ds, test, assert) {
        console.log(arguments);
        // the rest is a 'pure' module -- 
        // no executable code outside of a returned object/map of methods
    

    控制台/日志记录的输出正是我所期望的:[对象,对象,对象]

    ds.js的序言(带控制台/日志记录)如下:

    define(["ds"], function (ds) {
        console.log(arguments);
        // the rest is a 'pure' module
    

    控制台/日志记录的输出是:[undefined]

    为什么前者(ds.test.js)能够成功加载ds,但ds.js本身不能?这导致我的一个测试失败,因为ds返回的方法之一引用了一个本身的方法,即:'ds.assoc()'。有趣的是,在require.js之前,我们使用了一个自制的依赖管理器,并且测试没有在同一个方法上失败 - ds.js能够引用它自己。

    这是否是所谓的“循环依赖”问题?因为ds.test.js依赖于ds.js,而ds.js依赖于它自己。如果是这样,我如何解决我的问题?

    为了它的价值,首先加载ds.test.js - 它被“test.runner.js”作为名为“SUITE”的全局var拾取,其序言如下:

    define(["test", SUITE], function (test, suite) {
    

    然后加载任何测试套件(在此演员表中,ds.test.js)依次加载它正在测试的模块(例如“ds”)

    最后一个上下文是我在过去几周内刚刚继承了这段代码,我正在做的是基于我们现有的另一个应用程序从我们的自制滚动依赖管理器到require.js的转换。所以我想我要求在使用诸如“你为什么使用全局变量”这样的评论进行狙击之前要考虑到这一点;如果你有一个具体的替代方案的建议,我很期待它。

1 个答案:

答案 0 :(得分:1)

(评论根据请求添加为答案。)

如果ds引用了一个本身的方法,你不能直接调用你的例子函数assoc(),而不是尝试使用ds.assoc()吗? (这也消除了ds加载自身的感知需求。)