Как я могу быть гарантированно, что все последующие запросы будут обслуживаться из того же модуля или модуля с той же версией, которую обслуживал html?
Даже если вы это сделаете, у вас все еще будут проблемы.Особенно, если ваше приложение представляет собой одностраничное приложение.Учтите это:
- Пользователь заходит на ваш сайт, получает
index.html
v1 - Вы выпускаете веб-приложение: v2.Через несколько минут все модули работают под управлением версии 2.
- Пользователь по-прежнему имеет открытое веб-приложение с
index.html
v1 - . Пользователь перемещается в приложении.Для этого нужно загрузить
styles.css
.Пользователь получает styles.css
v2.Бум, ты смешиваешь версии, терпишь неудачу.
Я столкнулся с этой проблемой на производстве, и решить ее очень сложно.По моему опыту, лучшее решение:
- Пометить все ресурсы (css, js, imgs и т. Д.) Суффиксом версии (например,
styles.css
-> styles-v1.css
или хешемсодержимое файла styles-39cf1a0b.css
).Многие инструменты, такие как webpack, gulp и т. Д., Могут сделать это автоматически. index.html
не помечен, но он ссылается на другие ресурсы с правильным тегом. - При развертывании не делайтеудалите ресурсы для старых версий, просто объедините их с новейшими.Убедитесь, что клиенты со старым
index.html
все еще могут успешно их получить. - Удаляйте старые ресурсы после нескольких версий или, что лучше, через некоторое время (может быть, через 1 неделю?).
При этом сценарий, описанный выше, теперь работает нормально!
- Пользователь заходит на ваш сайт, получает
index.html
v1 - Вы выпускаете webapp: v2.Это заменяет
index.html
, но оставляет все js / css на месте, добавляя новые с суффиксом новой версии. - У пользователя по-прежнему открыто веб-приложение с
index.html
v1 - Пользователь перемещается в приложении.Это должно загрузить
styles-v1.css
, который загружается успешно и соответствует версии index.html.Нет смешивания версий = хорошо! - В следующий раз, когда пользователь перезагружает страницу, он получает
index.html
v2, что указывает на новый styles-v2.css
и т. Д. Все еще нет смешивания версий!
Делать это с kubernetes немного сложно, вам нужно заставить свой процесс сборки изображений брать файлы из нескольких старых изображений и включать их в новый образ, что немного странно.
Другое решение -перестать обслуживать ваши html / css / js из модуля и вместо этого использовать его из хранилища больших двоичных объектов.(Amazon S3, Google Cloud Storage и т. Д.).Таким образом, развертывание просто копирует все файлы, которые объединяются со старыми файлами, давая вам желаемое поведение.