Можно ли остановить 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);
};