Javascript 是否可以阻止requireJS自动添加.js文件扩展名?

Javascript 是否可以阻止requireJS自动添加.js文件扩展名?,javascript,requirejs,Javascript,Requirejs,我正在使用requireJS加载脚本。它有: 用于模块名称的路径不应包括.js 扩展,因为路径映射可以是一个目录 在我的应用程序中,我将所有脚本文件映射到配置路径中,因为它们是在运行时动态生成的(我的脚本从order.js开始,但变成order.min.b25a571965d02d9c54871b7636ca1c5e.js(这是文件内容的散列,用于缓存破坏) 在某些情况下,require会在这些路径的末尾添加第二个.js扩展名。虽然我在服务器端生成了动态路径,然后填充了配置路径,但我必须编写一些

我正在使用requireJS加载脚本。它有:

用于模块名称的路径不应包括.js 扩展,因为路径映射可以是一个目录

在我的应用程序中,我将所有脚本文件映射到配置路径中,因为它们是在运行时动态生成的(我的脚本从
order.js
开始,但变成
order.min.b25a571965d02d9c54871b7636ca1c5e.js
(这是文件内容的散列,用于缓存破坏)

在某些情况下,require会在这些路径的末尾添加第二个.js扩展名。虽然我在服务器端生成了动态路径,然后填充了配置路径,但我必须编写一些额外的javascript代码,以从有问题的文件中删除
.js
扩展名

在阅读requireJS文档时,我真的不明白为什么要将路径映射用于目录。这是否意味着可以在一次调用中加载整个目录的文件?我不明白

有人知道是否有可能强制require停止向文件路径添加.js,这样我就不必去破解它了

谢谢

更新:根据要求添加了一些代码示例

这在我的HTML文件中(这是一个Scala项目,因此我们不能将这些变量直接写入
.js
文件):

然后在我的
main.js中:

requirejs.config({
    paths: foo.js.modules
});

require([foo.js.modules.detect, foo.js.modules.images, "bean"], 
    function(detect, images, bean) {
        // do stuff
});
在上面的例子中,我必须使用字符串“bean”(它指的是require路径),而不是我的直接对象(就像其他使用
foo.js.modules.bar
),否则我会附加额外的
.js

希望这有意义。

requirejs':

加载脚本而不附加“.js”扩展名,对动态脚本非常有用

文档 检查
examples
文件夹。您可能需要的所有信息都将包含在注释中或示例代码本身上

基本用法 将插件放入
baseUrl
文件夹(通常与main.js文件相同的文件夹)中,或为插件位置创建别名:

require.config({
    paths : {
        //create alias to plugins (not needed if plugins are on the baseUrl)
        async: 'lib/require/async',
        font: 'lib/require/font',
        goog: 'lib/require/goog',
        image: 'lib/require/image',
        json: 'lib/require/json',
        noext: 'lib/require/noext',
        mdown: 'lib/require/mdown',
        propertyParser : 'lib/require/propertyParser',
        markdownConverter : 'lib/Markdown.Converter'
    }
});

//use plugins as if they were at baseUrl
define([
        'image!awsum.jpg',
        'json!data/foo.json',
        'noext!js/bar.php',
        'mdown!data/lorem_ipsum.md',
        'async!http://maps.google.com/maps/api/js?sensor=false',
        'goog!visualization,1,packages:[corechart,geochart]',
        'goog!search,1',
        'font!google,families:[Tangerine,Cantarell]'
    ], function(awsum, foo, bar, loremIpsum){
        //all dependencies are loaded (including gmaps and other google apis)
    }
);

如果您不想在noext上添加依赖项,也可以将一个伪查询字符串附加到路径中,以防止附加.js扩展名,如下所示:

require.config({
    paths: {
        'signalr-hubs': '/signalr/hubs?noext'
    }
});

这就是noext插件所做的。

我正在将requirejs服务器端与node.js一起使用。noext插件对我不起作用。我怀疑这是因为它试图将?noext添加到url,而我们使用的是文件名而不是url服务器端

我需要将我的文件命名为.njs或.model,以将它们与静态的.js文件分开。希望作者将更新requirejs,以避免对用户强制使用自动的.js文件扩展名约定

同时,这里有一个快速补丁来禁用此行为

要应用此修补程序(针对node_modules/requirejs/bin/r.js的2.1.15版):

  • 保存在名为disableAutoExt.diff的文件或其他文件中,然后打开终端
  • cd路径/到/节点\u模块/
  • 修补程序-p1<路径/到/禁用外部差异
  • 将disableAutoExt:true添加到requirejs.config:requirejs.config({disableAutoExt:true,})
  • 现在我们可以要求([“test/index.njs”,…]),然后继续工作

    在disableAutoExt.diff中保存此修补程序:

    --- mod/node_modules/requirejs/bin/r.js 2014-09-07 20:54:07.000000000 -0400
    +++ node_modules/requirejs/bin/r.js 2014-12-11 09:33:21.000000000 -0500
    @@ -1884,6 +1884,10 @@
             //Delegates to req.load. Broken out as a separate function to
             //allow overriding in the optimizer.
             load: function (id, url) {
    +            if (config.disableAutoExt && url.match(/\..*\.js$/)) {
    +                url = url.replace(/\.js$/, '');
    +            }
    +
                 req.load(context, id, url);
             },
    
    该补丁只是在第1887行附近添加了以下内容到node_modules/requirejs/bin/r.js:

    if (config.disableAutoExt && url.match(/\..*\.js$/)) {
        url = url.replace(/\.js$/, '');
    }
    
    更新:通过将url更改移到代码的更深处,改进了修补程序,因此在对模块调用undef后,它不再导致挂起。需要undef,因为:

    要在使用node.js开发时禁用模块缓存,请将此添加到主应用程序文件:

    requirejs.onResourceLoad = function(context, map)
    {
        requirejs.undef(map.name);
    };
    

    你能举一个require函数调用的例子吗?你在使用require.config()吗?你的设置是什么?谢谢-我在上面添加了一些代码。使用require.config()只是为了将路径推到require中。变量bean不会解析成任何东西(没有引号)。您必须使用完整的foo.js.modules.bean引用。就我个人而言,我使用的是引号形式,因此我不确定其他情况下会发生什么。不确定我是否遵循--除了在回调参数中,我将其与引号一起使用,但我不希望它是一个字符串。当我使用foo.js.modules.bean时,它会添加额外的“.js”扩展名。我现在明白了。这可能是可能会被认为是一个bug,但我总是在requirejs.config->path中的所有条目中省略“.js”。如果这样做,您应该能够使用foo.js.modules.ID引用或字符串“ID”,但是,根据模块本身的导出方式,您可能会遇到问题。例如,我无法使用引用方法导入jQuery,因为jQuery在id“jQuery”下导出自身,但requirejs不知道如何将其与“js/lib/jQuery-1.7.1”匹配我在路径下有一个条目。在我看来,这是更好的解决方案,您不需要再向加载中添加另一个库。只需在配置中添加六个额外字符。同意-这要简单得多。这也恰好是我正在寻找的示例(信号器)。谢谢!有人知道为什么我们不能在配置中有选项吗?我有类似的问题,所以我正在尝试你的解决方案。我可以在配置中包括上面的路径吗,没有添加noext插件。还有,我在哪里引用“信号集线器”?@BobStein VisiBone没有。这是如何工作的
    ?noext
    变成
    ?noext、 js
    ,它仍然充当伪查询字符串。
    requirejs.onResourceLoad = function(context, map)
    {
        requirejs.undef(map.name);
    };