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

Require.js looking in the wrong path for the nested dependencies

本文关键字:查找 嵌套 依赖 路径 js 错误 Require      更新时间:2023-09-26

我使用WebJars来管理我的JavaScript依赖项,这意味着我使用的大多数库都在Require.js基本路径之外。配置是自动创建的,适用于大多数库。我只对那些调用require()来加载一些内部依赖项(通常只是外部文件)的库有问题,例如当.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的位置来确定其他所需文件的正确位置,例如:

/webjars/when-node/3.5.2/lib/decorators/timed.js

但不幸的是,require.js使用main.js文件的位置作为基本路径,这显然会导致大量404错误和应用程序崩溃。

如何告诉require.js查找正确的子目录?

因此,根据RequireJS文档,这似乎是正确的行为。与CommonJS不同,每个require()调用都是使用基本路径解析的(它是相对于基本路径的,而不是相对于调用它的文件的位置)。

解决这个问题的唯一方法(据我所知)是将依赖项配置为一个包。然后,包位置将用于路径解析,而不是通用的基本路径。对于提到的when包,配置应该如下所示:

requirejs.config({
  packages: [
    { name: 'when', location: '/path/to/when', main: 'when' }
  ]
});

为了为我当前或未来的所有依赖项自动修复这个问题,我用自己的解决方案取代了Scala Play Framework加载脚本,该解决方案将所有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
        });
    }
}