Можно ли остановить requireJS от добавления расширения .js автоматически?
Я использую requireJS для загрузки скриптов. Он имеет эту деталь в документах:
Путь, используемый для имени модуля, не должен содержать .js расширение, поскольку сопоставление пути может быть для каталога.
В моем приложении я сопоставляю все мои файлы script в пути конфигурации, потому что они динамически генерируются во время выполнения (мои сценарии начинают жизнь как вещи типа order.js
, но становятся такими, как order.min.b25a571965d02d9c54871b7636ca1c5e.js
(это хэш содержимого файла, для целей кэширования).
В некоторых случаях require добавит второе расширение .js в конец этих путей. Хотя я генерирую динамические пути на стороне сервера, а затем заполняю путь к конфигу, я должен затем написать дополнительный код javascript, чтобы удалить расширение .js
из проблемных файлов.
Чтение документов requireJS, я действительно не понимаю, почему вы когда-либо хотели, чтобы сопоставление маршрутов использовалось для каталога. Означает ли это, что можно каким-то образом загружать целую директорию по достоинству файлов в один звонок? Я не понимаю.
Кто-нибудь знает, возможно ли просто заставить потребовать прекратить добавлять .js в пути к файлам, поэтому мне не нужно их взломать?
спасибо.
UPDATE: добавлены некоторые образцы кода в соответствии с запросом.
Это внутри моего 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")'
};
Затем внутри my 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
.
Надеюсь, что это имеет смысл.
Ответы
Ответ 1
requirejs 'noext plugin:
Загружать скрипты без добавления расширения .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)
}
);
Ответ 2
Если вам не хочется добавлять зависимость от noext, вы также можете просто добавить фиктивную строку запроса к пути, чтобы предотвратить добавление расширения .js, например:
require.config({
paths: {
'signalr-hubs': '/signalr/hubs?noext'
}
});
Это то, что делает плагин noext.
Ответ 3
Я использую серверную часть requirejs с node.js. Плагин noext не работает для меня. Я подозреваю, что это потому, что он пытается добавить? Noext к URL-адресу, и у нас есть имена файлов, а не URL-адреса серверов.
Мне нужно указать мои файлы .njs или .model, чтобы отделить их от статических файлов .js. Надеюсь, автор обновит requirejs, чтобы не форсировать автоматические соглашения о расширении файла .js для пользователей.
Между тем вот быстрый патч, чтобы отключить это поведение.
Чтобы применить этот патч (против версии 2.1.15 из node_modules/requirejs/bin/r.js):
- Сохраните файл с именем disableAutoExt.diff или что угодно и откройте терминал
- cd path/to/ node_modules/
- patch -p1 < путь/к/disableAutoExt.diff
- добавить 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$/, '');
}
UPDATE: улучшенный патч, перемещая url, глубже меняет код, поэтому он больше не вызывает зависание после вызова undef в модуле. Нужен undef, потому что:
Чтобы отключить кеширование модулей при разработке с помощью node.js, добавьте это в свой основной файл приложения:
requirejs.onResourceLoad = function(context, map)
{
requirejs.undef(map.name);
};