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