我使用WebJars来管理我的JavaScript依赖项,这意味着我使用的大多数库都在Require.js基本路径之外。配置是自动创建的,适用于大多数库。我只对那些调用require()
来加载一些内部依赖项(通常只是外部文件)的库有问题 - 例如when.js。
这是为时库生成的require.js配置:
requirejs.config({"paths":{"when":["/webjars/when-node/3.5.2/when","when"]}});
此文件正确加载。但问题是它试图加载更多文件:
...
var timed = require('./lib/decorators/timed');
var array = require('./lib/decorators/array');
var flow = require('./lib/decorators/flow');
var fold = require('./lib/decorators/fold');
...
我希望require.js使用when.js
的位置来确定其他所需文件的正确位置,即。 E:
/webjars/when-node/3.5.2/lib/decorators/timed.js
但遗憾的是,require.js使用main.js
文件的位置作为基本路径,这显然会导致很多404错误并且应用程序崩溃。
如何告诉require.js查看正确的子目录?
答案 0 :(得分:3)
因此根据RequireJS文档,这似乎是正确的行为。与CommonJS不同,每个require()
调用都使用基本路径解析(它相对于基本路径,而不是调用它的文件的位置)。
解决这个问题的唯一方法(据我所知)是将依赖项配置为一个包。然后将包位置用于路径解析而不是一般基本路径。对于提到的when
包,配置应如下所示:
requirejs.config({
packages: [
{ name: 'when', location: '/path/to/when', main: 'when' }
]
});
要自动解决所有当前或未来依赖项的问题,我已将Scala Play Framework loading script替换为我自己的解决方案,该解决方案将所有WebJar作为单独的包加载。
var require = {
callback : function () {
var packages = [];
var shim = {};
[
@for(webJarJson <- org.webjars.RequireJS.getSetupJson(routes.WebJarAssets.at("").url).values()) {
@Html(webJarJson.toString),
}
].forEach(function (webjar) {
if (webjar.paths) {
for (var name in webjar.paths) {
if (webjar.paths.hasOwnProperty(name)) {
packages.push({
name: name,
location: webjar.paths[name][0].replace(/\/[^\/]+$/, ""),
main: webjar.paths[name][1]
});
}
}
}
if (webjar.shim) {
for (var name in webjar.shim) {
if (webjar.shim.hasOwnProperty(name)) {
shim[name] = webjar.shim[name];
}
}
}
});
requirejs.config({
packages: packages,
shim: shim
});
}
}