53

我正在使用 requireJS 加载脚本。它在文档中有这个细节

用于模块名称的路径不应包含 .js 扩展名,因为路径映射可能用于目录。

在我的应用程序中,我将所有脚本文件映射到配置路径中,因为它们是在运行时动态生成的(我的脚本开始时就像这样order.js,但变成了这样order.min.b25a571965d02d9c54871b7636ca1c5e.js(这是文件内容的哈希,用于缓存清除目的) .

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

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

有谁知道是否可以强制要求停止将 .js 添加到文件路径,这样我就不必绕过它了?

谢谢。

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

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

foo.js.modules = {
    order               : '@Static("javascripts/order.min.js")',
    reqwest             : 'http://5.foo.appspot.com/js/libs/reqwest',
    bean                : 'http://4.foo.appspot.com/js/libs/bean.min',
    detect              : 'order!http://4.foo.appspot.com/js/detect/detect.js',
    images              : 'order!http://4.foo.appspot.com/js/detect/images.js',
    basicTemplate       : '@Static("javascripts/libs/basicTemplate.min.js")',
    trailExpander       : '@Static("javascripts/libs/trailExpander.min.js")',
    fetchDiscussion     : '@Static("javascripts/libs/fetchDiscussion.min.js")'
    mostPopular         : '@Static("javascripts/libs/mostPopular.min.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附加值。

希望这是有道理的。

4

3 回答 3

116

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

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

这就是 noext 插件的作用。

于 2013-03-13T17:55:20.023 回答
14

requirejs 的noext 插件

加载脚本而不附加“.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)
    }
);
于 2012-06-28T19:46:10.883 回答
0

我在 node.js 中使用 requirejs 服务器端。noext 插件对我不起作用。我怀疑这是因为它试图将 ?noext 添加到 url 并且我们有文件名而不是 urls 服务器端。

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

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

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

  1. 保存在名为 disableAutoExt.diff 或其他文件中并打开终端
  2. cd 路径/到/node_modules/
  3. 补丁 -p1 < path/to/disableAutoExt.diff
  4. 添加 disableAutoExt: true, 到你的 requirejs.config: requirejs.config({disableAutoExt: true,});

现在我们可以做 require(["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);
         },

该补丁只是在 node_modules/requirejs/bin/r.js 的第 1887 行附近添加以下内容:

if (config.disableAutoExt && url.match(/\..*\.js$/)) {
    url = url.replace(/\.js$/, '');
}

更新:通过在代码中更深地移动 url 更改来改进补丁,因此在模块上调用 undef 后它不再导致挂起。需要undef,因为:

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

requirejs.onResourceLoad = function(context, map)
{
    requirejs.undef(map.name);
};
于 2014-11-29T14:50:29.180 回答