是否有可能停止requireJS自动添加.js文件扩展名?

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

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

在我的应用程序中,我将所有脚本文件映射到configurationpath中,因为它们是在运行时dynamic生成的(我的脚本像order.js一样开始生活,但变成了order.min.b25a571965d02d9c54871b7636ca1c5e.js (这是一个文件内容的散列,用于cachebusting目的)。

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

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

有谁知道是否有可能只是强制要求停止添加.js到文件path,所以我不必破解它?

谢谢。

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

这是在我的HTML文件(这是一个Scala项目,所以我们不能将这些variables直接写入一个.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 }); 

在上面的例子中,我必须使用string“bean”(指的是要求的path),而不是我的直接对象(像其他人使用foo.js.modules.bar )否则我得到额外的.js附加。

希望这是有道理的。

requirejs'noext 插件 :

加载脚本时不添加“.js”扩展名,对dynamic脚本非常有用…

文档

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

基本用法

将插件放在baseUrl文件夹(通常与main.js文件相同的文件夹)内,或者为插件位置创build一个别名:

 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的依赖关系,则还可以将一个虚拟查询string附加到path中,以避免附加.js扩展名,如下所示:

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

这是noext插件所做的。

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

我需要命名我的文件.njs或.model将它们从静态.js文件中分离出来。 希望作者将更新requirejs,不强制对用户的自动.js文件扩展名约定。

同时这里是一个快速修补程序来禁用此行为。

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

  1. 保存在一个名为disableAutoExt.diff的文件或任何打开一个terminal
  2. cdpath/到/ node_modules /
  3. patch -p1 <path / to / disableAutoExt.diff
  4. 将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进行开发时禁用模块caching,请将其添加到主应用程序文件中:

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