RequireJS绝对路径产生脚本错误

8

我有一个简单的文件,使用define和requireJS加载依赖项:

define([
    "dojo/_base/declare",
    "dojo/aspect",
    "local/path/to/myFile"
], function(
    declare,
    aspect,
    myFile
) { ...

这个代码可以正常工作,文件已经在requireJS配置中映射。
然而,如果我尝试使用绝对路径访问其中一个文件(完全相同的文件):
define([
    "dojo/_base/declare",
    "dojo/aspect",
    "https://blah.com/absolute/path/to/myFile.js"
], function(
    declare,
    aspect,
    myFile
) { ... 

我遇到了以下错误:
"message": "Error: Script error for \"https://blah.com/absolute/path/to/myFile.js\", needed by: /home/test_vds_jasmine/test/modules/myFile-spec4.js\nhttp://requirejs.org/docs/errors.html#scripterror\nat /home/node_modules/requirejs/require.js:168:17\n\nmakeError@/home/node_modules/requirejs/require.js:168:17\nnewContext/context.onScriptError@/home/node_modules/requirejs/require.js:1738:36\n"
我尝试了各种绝对路径,包括带和不带https,带和不带.js扩展名,但都没有成功,错误信息并没有真正有用。
我是不是以错误的方式调用了绝对路径?有人有这样的经验吗?
我必须使用绝对路径来调用某些文件,这是有合理原因的,否则我会调用所有本地文件。

1
看看这些是否有帮助 https://dev59.com/QmEi5IYBdhLWcg3wIJFH, https://dev59.com/rmkw5IYBdhLWcg3wn7-O, https://coderwall.com/p/y4vk_q/requirejs-and-external-scripts - Tarun Lalwani
@Sebastian,正如我在原帖中所说的那样,如果我将它包含在本地而不是绝对路径下,它就可以正常工作,所以文件没问题,是的,该文件使用了define。感谢您提供break-on-exception的想法。 - StudioTime
1
@DarrenSweeney 加载该文件的网络请求结果是什么?在调试器中,检查响应的HTTP状态和实际传输的内容(可能与您期望的内容不同)。如果网络请求失败或您获得错误的内容,则RequireJS无法解决该问题,问题出在其他地方。 - Louis
1
@DarrenSweeney请展示加载文件的定义语句以及实际异常的消息。此外,您的设置中是否有任何baseUrl/path定义?如果通过https加载,它们将被应用不同。因此,依赖项将使用不同的策略解决。 - Sebastian
1
@DarrenSweeney,关于我发布的链接,有更新了吗?它有帮助还是没有? - Tarun Lalwani
显示剩余2条评论
2个回答

6
请尝试将您的URL放入requirejs配置中,像这样:

requirejs.config({
        paths: { 'myFileRemote': 'https://blah.com/absolute/path/to/myFile.js' }
    });

现在使用上述映射更新您的文件:

define([
    "dojo/_base/declare",
    "dojo/aspect",
    "myFileRemote"
], function(
    declare,
    aspect,
    myFile
) { ... 

1

建议的解决方案

您的 myFile.js 应该有一个定义块,以便像这样使用。使用定义结构升级您的 myFile.js

myFile.js:

define(["./cart", "./cart2"], function(cart, cart2) {
    return {
        color: cart.color,
        size: "large",
        addToCart: function() {
        }
    }
});

替代方案

如果您无法修改 myFile.js 的结构,请将其添加到 requirejs 配置的 path 中,就像添加 jQuery 一样。 您可以将配置添加到 myFile.jsapp.js 的顶部(从中调用 myFile.js 的文件)。 如果将配置添加到 app.js,则可以从任何地方访问它。

myFile.js/app.js:

require.config({
    paths: {
        "myFile": "https://blah.com/absolute/path/to/myFile"
    }
});

然后,您可以按照以下方式使用它:

myFile.js:

define([
    "dojo/_base/declare",
    "dojo/aspect",
    "myFile"
], function(
    declare,
    aspect,
    myFile
) { ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接