如何使用Require.js加载Q库?

时间:2016-02-02 20:25:19

标签: javascript requirejs q

我的库使用kriskowal/Q promises library,现在我正在尝试加载(使用requirejs)使用我的库的应用程序,因此我将所有路径和填充程序放入,requirejs.config部分如下所示:< / p>

requirejs.config({
    baseUrl: './',
    catchError: false,
    paths: {
        beril: '../engine/build/src/bundle',
        lodash: 'bower_components/lodash/lodash',
        three: 'bower_components/three.js/build/three',
        q: 'bower_components/q/q',

    },
    shim: {
        lodash: {
            exports: '_'
        },
        three: {
            exports: 'THREE'
        },
        q: {
            exports: 'Q'
        },
        beril: {
            deps: ['lodash', 'three', 'q'],
            exports: 'beril'
        },
    }
});

在此之后我假设变量THREE,_和Q在全局空间中定义。 现在我用这个简单的行加载和运行应用程序:

require(['beril', 'js/stepbystep/' + $stateParams.page + '/app'], (beril, app) => app());

然后我收到错误:ReferenceError: Q is not defined即使我在Chrome网络检查员中看到Q库已加载。

enter image description here

还定义了所有其余依赖项(THREE和_)。看起来像requirejs的垫片对这个库不起作用。它可以或者我错过了什么吗?

那么我做错了什么,我应该如何应对这种情况?

4 个答案:

答案 0 :(得分:0)

我找到了解决方案,它是将init函数添加到我的库的垫片中,然后手动添加Q作为全局对象,所以我的垫片部分现在看起来像这样:

shim: {
    lodash: {
        exports: '_'
    },
    three: {
        exports: 'THREE'
    },
    q: {
        exports: 'Q'
    },
    beril: {
        deps: ['lodash', 'three', 'q'],
        exports: 'beril',
        init: function(lodash, three, q){
            window.Q = q;
        }
    },
}

然而,我不清楚为什么没有这个就行不通,有没有更好的方法来处理这种情况。

答案 1 :(得分:0)

您的配置存在一些问题。首先,您有不必要的shim配置。我刚刚安装了lodash(使用bower install lodash)并搜索了它的代码。它调用define。因此,不得为其设置shim。 RequireJS不会给你一个错误,但你会得到未定义的行为。 Q也是如此:它调用define,因此没有shimLast I checkedTHREE需要shim

Q调用define的事实也是它不会将符号Q泄漏到全局空间的原因。它就像一个表现良好的AMD模块。

好的,那么我们怎样才能让Beril找到Q? Your solution有效,但我发现它有些不确定。问题是在加载了shimmed模块之后执行了init 。只要Beril仅在稍后要执行的函数体中引用Q,它就会起作用。我猜这就是Beril现在的工作方式。但是,如果新版本的Beril需要在包含Beril的文件首次执行时引用Q,则它将失败,因为Q尚不存在。

解决未来问题的一种方法是使用map和一些粘合剂。保留shim beril,但请移除init。定义名为q-glue的模块:

define(['q'], function (Q) {
    window.Q = Q;
    return Q;
});

并在您的配置中声明此map

map: {
    beril: {
        q: "q-glue"
    }
}

这表示“从q加载beril请求q-glue时。”通过这样做,{<1}}将在 Beril加载之前定义

我认为你是Beril的作者。我建议你让你的库与AMD兼容,以免你的库的用户不得不经历配置困难,让它与AMD加载器(如RequireJS)一起工作。

答案 2 :(得分:-1)

在我自述降级到0.9版本直到1.0.1后,它对我有用,如自述文件中所述。当前版本2.0.2具有显着的制动变化,正如Kris Kowal here所述。

我没有必要设置全局变量,因为旧版本检查环境,如果在require之前加载则这样做。

答案 3 :(得分:-2)

您需要将q添加到require() ...

require(['beril', 'q', 'js/stepbystep/' + $stateParams.page + '/app'], (app, beril, q) => app());