首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否可以阻止requireJS自动添加.js文件扩展名?

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

Stack Overflow用户
提问于 2012-05-14 22:15:38
回答 3查看 19.5K关注 0票数 53

我正在使用requireJS加载脚本。它有this detail in the docs

用于模块名称的路径不应包含.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
});

在上面的示例中,我必须使用字符串“.js”(引用请求路径),而不是我的直接对象(就像其他使用foo.js.modules.bar的对象一样),否则我会得到附加的额外bean。

希望这是有意义的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-29 03:46:11

requirejs的noext plugin

不附加".js“扩展的

加载脚本,对动态脚本很有用...

文档

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

基本用法

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

require.config({路径:{//创建插件的别名(如果插件在baseUrl上则不需要)异步:'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‘} });//像在baseUrl定义([ '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!可视化,1,包:核心图表,地理图’,‘goog!搜索,1’,'font!google,家族:橘色,Cantarell‘],function(awsum,foo,bar,loremIpsum){ //所有依赖项都已加载(包括gmaps和其他google apis) } );

票数 14
EN

Stack Overflow用户

发布于 2013-03-14 01:55:20

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

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

这就是noext插件的作用。

票数 116
EN

Stack Overflow用户

发布于 2014-11-29 22:50:29

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

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

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

要应用此修补程序(针对版本2.1.15的node_modules/requirejs/bin/r.js),请执行以下操作:

将path/to/node_modules/

  • patch保存在名为disableAutoExt.diff的文件中,然后打开终端

  • cd path/to/node_modules/

  • patch -p1 < path/to/disableAutoExt.diff

  • add disableAutoExt: true,to 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);
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10585099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档