Обновление: AppCache был устаревшим летом 2015 года, поэтому нижеследующее не является лучшим решением. Новая рекомендация заключается в том, чтобы вместо этого использовать Service Workers. Тем не менее, работники службы в настоящее время все еще экспериментальны с отрывочной (читаемой: возможно, нет) поддержкой в IE и Safari.
В качестве альтернативы, многие инструменты сборки теперь без проблем включают в себя функции кэширования кеша и файлы «управление версиями» для решения вопроса OPs. WebPack, возможно, является нынешним лидером в этом пространстве.
Это может быть хороший случай использования для использования в HTML5 AppCache
Вы, вероятно, хотите автоматизировать некоторые из этих шагов в ваших сценариях развертывания, но здесь есть некоторый код, вы могли бы найти полезным, чтобы вы начал.
Сначала создайте файл манифеста appcache. Это также позволит вам кэшировать ресурсы в браузере клиента, пока вы явно не измените дату файла манифеста appcache.
/приложение.AppCache:
CACHE MANIFEST
#v20150327.114142
CACHE:
/appcache.js
/an/image.jpg
/a/javascript/file.js
http://some.resource.com/a/css/file.css
NETWORK:
*
/
В app.appcache, комментарий на линии #v20150327.114142
как мы указываем броузеру, что манифест изменилось и ресурсы должны быть перезагружен. Это может быть что угодно, если файл будет отличаться от браузера предыдущей версии. Во время развертывания нового кода в вашем приложении эта строка должна быть изменена. Также можно использовать идентификатор сборки.
Во-вторых, на всех страницах, которые вы хотите использовать AppCache, изменить тег заголовка, как, например:
<html manifest="/app.appcache"></html>
Наконец, вам нужно добавить некоторые JavaScript, чтобы проверить AppCache каких-либо изменений, и если есть, что-то с этим поделать. Вот Angular module. Для этого ответа, вот ваниль пример:
appcache.js:
window.applicationCache.addEventListener('updateready', function(e) {
if (window.applicationCache.status == window.applicationCache.UPDATEREADY) {
// Browser downloaded a new app cache.
// Swap it in and reload the page to get the latest hotness.
window.applicationCache.swapCache();
if (confirm('A new version of the application is available. Would you like to load it?')) {
window.location.reload();
}
}
else {
// Manifest didn't changed. Don't do anything.
}
}, false);
В качестве альтернативы, если AppCache не будет работать для вашей ситуации, более Гетто решением было бы создать простой API конечной точки который возвращает текущий идентификатор сборки или дату последнего развертывания. Ваше угловое приложение иногда попадает в эту конечную точку и сравнивает результат с его внутренней версией, а если отличается, перезагружается сама.
Или вы можете рассмотреть сценарий live-reload (example), но, будучи очень полезным в разработке, я не уверен, насколько хороша идея использовать live/in-place-reloading активы в производство.
Вау! AppCache. Я думаю, что это может быть немного для того, что мне нужно ... особенно, поскольку я вижу, что IE9 не выглядит поддерживаемым, и Firefox, похоже, требует согласия пользователя. Мне действительно нравится идея решения «гетто» - проверка конечной точки API с заданным интервалом и вызов window.location.reload(), если это необходимо.На самом деле мне кажется приятным и простым ... хотя я уверен, что кто-то скажет мне, что я могу сделать то же самое так же легко с socket.io .... – Andrew
yea; вы можете сделать это с помощью socket.io .. но это слишком много накладных расходов только для «обновления в реальном времени». Пинг сервера на тайм-аут кажется достаточным (и более дешевым с точки зрения ресурсов, вам не нужно беспокоиться о загрузке открытых соединений сокетов или беспокоиться о балансировке нагрузки при масштабировании ..) Если, конечно, ваше приложение уже использует socket.io. Тогда это имеет смысл. –
Yep - Я думаю то же самое ... слишком много накладных расходов. Вероятно, мы добавим socket.io в ближайшие несколько месяцев, но я думаю, что будет идти с использованием подхода ping API до тех пор, пока мы на самом деле этого не сделаем. Спасибо за Ваш ответ! – Andrew