【问题标题】:RequireJS does not follow relative path for data-main with baseUrl setRequireJS 不遵循设置 baseUrl 的数据主的相对路径
【发布时间】:2013-11-10 01:08:39
【问题描述】:

使用 requireJS,我试图为我的数据主指定一个不同于 baseUrl 的路径。似乎 requireJS 忽略了我在文件名之前输入的任何内容,并始终在 baseUrl 文件夹中查找文件。

我有以下文件夹结构:

index.html
scripts/
  lib/
    require.js
  test/
    main2.js
  config.js

index.html 的内容:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>Test</title>
        <script data-main="test/main2" src="scripts/lib/require.js"></script>
        <script src="scripts/config.js"></script>
    </head>

    <body></body>
</html>

config.js 的内容:

requirejs.config({
    baseUrl: "scripts"
});

我收到 404 错误:GET [...]/scripts/main2.js,即使它应该在寻找 [...]/scripts/test/main2.js。如果我删除 config.js 文件并使用 data-main="scripts/test/main2" 它可以工作,但我希望能够为我的项目指定一个 baseUrl。

有什么想法吗?

编辑:按照 Waxen 的回答:

  • 即使我在 data-main 中使用“scripts/test/main2”、“/scripts/test/main2”或“whateverIWant/main2”,它奇怪地总是寻找“scripts/main2.js”李>

请注意,我使用的是 requirejs 2.1.8

【问题讨论】:

  • 我已回滚您的上次编辑 - 从您的问题中接受的答案中查看代码是一种误导。您已接受答案这一事实足以告诉其他用户您问题中问题的解决方案是什么!

标签: javascript requirejs


【解决方案1】:

这不符合您的要求,因为您在设置 baseURL 之前使用 data-main 调用 require。我不确定它为什么要尝试转到 scripts/main2.js;我希望它尝试加载 test/main2.js 而不是 scripts/main2.js。然而,这无关紧要。

您需要做的是确保您的 baseURL 在尝试加载您的 data-main 之前可用。这可以通过首先包含您的配置并使用此处第二个示例中的语法来完成:http://requirejs.org/docs/api.html#config


index.html 的内容:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>Test</title>
        <script src="scripts/config.js"></script>
        <script data-main="test/main2" src="scripts/lib/require.js"></script>
    </head>

    <body></body>
</html>

config.js 的内容:

var require = {
    baseUrl: "scripts"
};

【讨论】:

  • 非常感谢您的回答。我测试了您不依赖 data-main 属性的方法,它确实有效。但是,如果我在 data-main 中给出完整路径(“scripts/test/main2”或“/scripts/test/main2”),我仍然会收到 404 错误,说它找不到 scripts/main2.js,它没有匹配我给出的路径。我正在使用requirejs 2.1.8。我更喜欢 data-main 方法,这样我就可以对主应用程序和单元测试使用相同的配置文件。
  • 你说得对,第一个不起作用。我在本地运行了几个测试并更新了我的答案以删除第一个选项,并更新了剩余的解决方案以使用 data-main。
  • 在文档中说明的 require.js 文件之前包含配置确实可以解决问题,非常感谢
【解决方案2】:

我读了这个帖子,不太明白为什么使用 data-main 属性指向一个配置 js 文件与在加载 Require 之前指定配置不同,正如这个帖子的答案所暗示的那样。

在我的实验中,我了解到使用 data-main config js 文件设置值可能有效(同样,它可能无效)。对于那些刚接触 Require 和 AMD 以及一般的异步性的人来说,“可能工作”的概念与异步操作在那时可以运行的事实有关——而不是以任何可预测的顺序运行。

确定了这一点,在当前版本的 RequireJS 文档中提出了一个非常重要的观点,直到现在我都没有意识到:

你也可以从你的数据主入口点调用 require.config,但是 请注意,数据主脚本是异步加载的。避免 其他错误地假设 data-main 及其 require.config 将始终在其脚本加载之前执行。

更多信息,请参阅:http://requirejs.org/docs/api.html#data-main

作为 RequireJS 的新手,得知这一点我有点震惊——我浪费了很多时间来调试路径访问问题。在这个阶段,我不清楚为什么有人会使用 data-main(尤其是定义一个 baseUrl),因为这个引用只会随机工作。相反,此线程建议的解决方案(您在非异步的脚本标记中设置 baseUrl,将按预期工作,并在启动 RequireJS 之前可靠地设置 RequireJS 配置。

【讨论】:

  • 你说“有点震惊”很有趣,它实际上让我很生气......那么,如果 requirejs 本身甚至不能保证它的配置已经加载,那么 requirejs 有什么意义呢? imo,这是一个严重的缺陷。那么答案不是钝的“在所有代码之前只需要 ['scripts/config']”,而是添加一个新功能,“required”或“requiredWithConfig”,它会等到配置实际加载,并且可能不会运行如果配置加载失败,这比无法加载配置正确加载的东西的随机 javascript 错误要好。
猜你喜欢
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 2013-03-04
相关资源
最近更新 更多