【问题标题】:'no such file' error when using grunt-requirejs compile使用 grunt-requirejs 编译时出现“没有这样的文件”错误
【发布时间】:2013-12-06 13:22:50
【问题描述】:

由于 require.js 构建的大多数问题都与文件结构和相对路径引用有关,我在这里创建了一个 repo:https://github.com/ttback/requirejs-example 以便于排除故障。

错误是当我运行 grunt 时,我会得到no such file or directory requirejs-example/src/js/bundle/js/bundle/utils.js

这是由于错误的 baseUrl。我希望它是src/,但我无法设置它,因为它会根据我的 Gruntfile 查找 src/js/bundle/main.js 的依赖项。所以基地在src/js/bundle。当前的 main.js 与 index.html 一起使用,如果我在 main.js 中将 utils.js 的相对路径从 .js/bundle/utils.js 更改为 ./utils.js,则应用程序将中断。

有什么方法可以让 grunt-requirejs 与我所拥有的一起工作?

【问题讨论】:

    标签: requirejs r.js grunt-contrib-requirejs


    【解决方案1】:

    首先,添加一个像样的代码示例的要点。

    这个问题其实很容易解决。

    简单的改变:

    var utilsObject = require('./js/bundle/utils.js');
    

    到:

    var utilsObject = require('./utils');
    

    现在构建工具和应用程序可以工作了。

    通过添加 .js 后缀,您绕过了 RequireJS 应用于模块路径的 baseUrl 规则。来自文档:

    RequireJS 还默认所有依赖项都是脚本, 因此它不希望在模块 ID 上看到尾随的“.js”后缀。

    有时您确实想直接引用脚本并且 不符合查找它的“baseUrl + 路径”规则。如果一个模块 ID具有以下特征之一,ID不会通过 通过“baseUrl + 路径”配置,并被视为 相对于文档的常规 URL:

    • 以“.js”结尾。
    • 以“/”开头。
    • 包含 URL 协议,例如“http:”或“https:”。

    http://requirejs.org/docs/api.html#jsfiles

    【讨论】:

    • 谢谢,但这是我尝试的第一件事。如果您更改它并按原样运行应用程序会发生什么,它将无法找到实用程序。 (构建工具将工作并生成 build.js)如果我通过执行
    • 我更改了这一行并在浏览器中运行应用程序。所有文件都正确加载(我看到了警报)并且构建工具工作。您说您尝试使用 .js 扩展名,您是否尝试过没有?
    • 我明白了...嗯,会再试一次,后缀上的有趣点
    • 我明白了,所以为了不让它将其视为相对路径,而是通过 requirejs 的 baseURL 设置,我必须不使用 .js ......有趣的一点。谢谢。这应该可以解决我的大部分问题,使其适用于 r.js 和没有 r.js。你知道为什么当我只加载 build.js(用它替换 main.js)时,它不会做任何事情吗? document.ready 代码好像没有被执行,是不是要从主模块中取出来?
    最近更新 更多