我的库使用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库已加载。
还定义了所有其余依赖项(THREE和_)。看起来像requirejs的垫片对这个库不起作用。它可以或者我错过了什么吗?
那么我做错了什么,我应该如何应对这种情况?
答案 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
,因此没有shim
。 Last I checked,THREE
需要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());