Требование - управление версиями
Быстрое примечание - путем управления версиями я имею в виду для целей перебора кеша. Обычная практика добавления параметров запроса в конец запроса script не работает во всех браузерах. Самый простой и самый грязный способ, который я нашел на сегодняшний день, - это версия всего моего имени папки развертывания.
-- scripts.v1
-- scripts.v2
Но это невероятно беспорядочно и mucks вверх время развертывания слишком (я использую S3 как мой cdn). Кто-нибудь знает об альтернативном методе?
ИЗМЕНИТЬ
Кажется, я не был очень ясен. Позвольте мне быть более явным.
Я использую requirejs на своем сайте. Это довольно тяжелое приложение JavaScript с частыми обновлениями и итерациями. Теперь с помощью requirejs, единственный способ, которым я могу надежно удостовериться, что браузеры обслуживают последнюю версию, - это версия моего всего имени папки развертывания (javascript) и снова загружать всю партию файлов на S3. Затем я использую метод data-main
для установки базового пути проекта.
По многим причинам это довольно громоздко. Даже если изменение кода всего несколько строк, весь процесс необходимо повторить. Есть ли какой-нибудь другой достойный метод, позволяющий requirejs знать, что файлы имеют версии? Как и в случае, если я вызываю
require(["superImportantJSFile"], function(){})
он будет знать, что текущая версия superImportantJSFile.v4.js
или что-то в этих строках.
Надеюсь, теперь я был более ясен. Какие-либо предложения относительно того, как сообщество в целом это делает? Я уверен, что это должен быть общий сценарий, но я не смог найти хорошее решение для этого еще
Ответы
Ответ 1
HTML5 Boilerplate предлагает одно из самых изящных решений, которые я видел. У них есть конфиги, доступные для Apache и nginx, Оттуда вы можете добавить временную метку к имени файла в тегах script
, например:
<script src="scripts/app.20130728.js"></script>
Какой веб-сервер будет переписываться на scripts/app.js
.
Ответ 2
Вы можете добавить псевдонимы в свою конфигурацию RequireJS, используя map
(см. http://requirejs.org/docs/api.html#config-map):
require.config({ /* ... other config.... */
map: { '*': {'superImportantJSFile': 'superImportantJSFile.v4'} }
})
Итак, у вас есть только одно место для обновления:)
Вы упоминали об использовании CDN, который является хорошим прецедентом, чтобы не помещать эти файлы в свернутый пакет r.js
(в случае, если вы используете этот инструмент). Но если эти файлы часто обновляются, возможно, имеет смысл упаковать ваши модули с помощью r.js
и обновить весь код.
Ответ 3
Мне нравится использовать шаг пост-сборки, который ставит статические ресурсы в папку с путём, который включает номер версии управления версиями. Например, номер версии 1234 управления версиями приведет к созданию пути:/1234/scripts/*. Эти каталоги также создаются в CDN с правильной версией активов внутри.
В нашей конфигурации require.js в шаблоне мы заменяем baseURL соответствующей ревизией, которая управляется через файл конфигурации, например:
var require = {
baseUrl: "%%resDir%%",
...
};
Это упрощает изменение версий активов между несколькими разными версиями, которые могут оставаться на CDN без каких-либо конфликтов. Он также решает проблему сбоя кэша браузера.