Require.js查找嵌套依赖项的错误路径

时间:2015-02-08 20:30:53

标签: javascript requirejs

我使用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查看正确的子目录?

1 个答案:

答案 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
        });
    }
}
相关问题