Require.js - Как установить версию на требуемые модули как часть URL?

Я использую require.js для использования JS-модулей в своем приложении.

Мне нужен способ обвалить кеш клиента новыми модулями JS с помощью другого запрошенного URL.

i.e, если файл hello/there.js уже был кэширован на клиенте, я могу изменить имя файла, чтобы заставить браузер получить новый файл.

Другими словами, для модуля hello/there я бы хотел, чтобы require.js запрашивал url hello/there___v1234___.js (имя файла может выглядеть по-другому, это просто пример) в соответствии с версией, которая доступна на клиенте.

Каков наилучший способ достичь этого?

Ответ 1

ОК, я googled "requirejs cache bust" для вас и нашел этот существующий ответ SO, в котором говорится, что вы можете настроить requireJS с параметром urlArgs, который только частичное решение, но этого может быть достаточно, чтобы удовлетворить ваши непосредственные потребности.

Тем не менее, проблема с кэшированием полна вызовов, и многие "решения" фактически не решают проблему в целом. Единственный поддерживаемый способ сделать это (IMHO на данный момент) - это полноценная система управления активами, такая как конвейер Ruby on Rails или соединительные активы или эквивалент для вашей выборки на стороне сервера. Они могут исправить вычисление контрольной суммы (обычно MD5 или SHA1) содержимого каждого файла и дать вам имена файлов, которые вы должны поместить как URL-адреса в теги HTML script. Таким образом, не мешайте ручным изменениям имен файлов на основе номеров версий, просто используйте контрольные суммы, так как они легко автоматизированы и надежны.

Из того, что я могу сказать, из ящика requirejs не может выполнить аспект кэширования для вас. Возможно, вы захотите прочитать этот поток групп google. В противном случае вам может понадобиться пара requirejs с дополнительным инструментом / script, чтобы получить хорошие контрольные суммы кеш-памяти.

Ответ 2

Я действительно разочаровался в решении urlArgs и, наконец, сдался и внедрил мое собственное исправление непосредственно в require.js. Это исправление реализует ваше идеальное решение, если вы хотите изменить свою версию библиотеки.

Здесь вы можете увидеть патч:

https://github.com/jbcpollak/requirejs/commit/589ee0cdfe6f719cd761eee631ce68eee09a5a67

После добавления вы можете сделать что-то подобное в своей конфигурации:

var require = {
    baseUrl: "/scripts/",
    cacheSuffix: ".buildNumber"
}

Используйте свою систему сборки или серверную среду для замены buildNumber идентификатором версии или версией программного обеспечения.

Используйте так:

require(["myModule"], function() {
    // no-op;
});

Потребуется запросить этот файл:

http://yourserver.com/scripts/myModule.buildNumber.js

Патч будет игнорировать любой script, который указывает протокол, и не будет влиять на файлы, не относящиеся к JS.

В нашей серверной среде мы используем правила перезаписи URL, чтобы вырезать номер сборки и обслуживать правильный JS файл. Таким образом, нам не нужно беспокоиться о переименовании всех наших JS файлов.

Это хорошо работает для моей среды, но я понимаю, что некоторые пользователи предпочтут префикс, а не суффикс, поэтому его легко скопировать в соответствии с вашими потребностями.

Вот несколько возможных повторяющихся вопросов:

Требование и кэширование прокси-серверов

Предотвратить требование требуемых скриптов для кэширования

Ответ 3

HTML5 Boilerplate имеет ant-build-script, который переименовывает ваши файлы и любую ссылку на них по этой точной причине и может сделать больше. Стоит проверить, если вы еще этого не сделали.

Ответ 4

Просто сделайте это, как создатель requirejs предлагает:

var load = requirejs.load;
requirejs.load = function (context, moduleId, url) {
  // modify url here
  url = url.substring(0, url.lastIndexOf('.')) + '.' + VERSION + url.substring(url.lastIndexOf('.'));
  return load(context, moduleId, url);
};

https://github.com/jrburke/requirejs/wiki/Fine-grained-URL-control