Проблема связана с ситуацией, когда у нас Lazy Loading Module. Собрали мы проект, все js-файлы имеют в наименовании определенный hash, чтобы при изменении брались не из кэша, а загружались по новой. Так вот, пользователь зашел на сайт, приложение инициализировалось, но, допустим, в раздел с подгружаемым модулем он не зашел. Он не закрывает вкладку, и вот мы снова собираем проект с изменениями в разделе этого модуля. Теперь пользователь переходит в этот раздел, в его index.html прописан файл с определенным hash'ом, но такого файла более не существует. Что можно предпринять в данной ситуации? Пользователь получит ошибку, а это уже не хорошо
Алексей Зуев, За свой проект. Вот заканчиваю первую часть приложения, скоро запускаю, а так как разработку проекта разбил на этапы (буду выкладывать нововведения по мере разработки), то пока все эти этапы не закончатся - обновление приложения будет частым)) А значит и такие вот проблемы для пользователей будут довольно частыми :D
Тут проблема не ангуляра, всё работает так же, как и с любым другим кодом, который осуществляет lazy загрузку. И логика наверно даже такая же как и с рефреш токеном: свалился запрос - позаботься о повторном получении access токена. Если у вас маппинг модулей конфигурируется в самом приложении, то можете с сервера слать сообщение signalr или что-то подобное чтобы обновить этот маппинг, или же catch и вытаскивать файл с сервера, где есть маппинг с обновленными хэшами. Еще есть идея сделать подобие hmr, но опять же все эти hmr через сокеты работают
Алексей Зуев, Вот это интересно. Можно даже оффлайн приложение без проблем сделать, только придумать где хранить данные, чтобы потом синхронизировать )) Вот, вроде неплохую статью нашел по Service Worker
Алексей Зуев, Блин, решил попробовать сначала на старом проекте, там нужнее. Переписал с HttpModule на HttpClientModule, чтобы использовать HttpInterceptor. Но HttpInterceptor, к сожалению, не обращает никакого внимания на запросы chunk'ов )
Алексей Зуев, Решил проблему создав свой ErrorHandler имплементирующий ErrorHandler из angular.core. Отлавливаю ошибку (правда пришлось через indexOf пару слов в ошибке искать), выкидываю сообщение о том, что было обновление и приложение будет перезагружено, и через 3 секунды перезагружаю приложение. Всё :)
Есть два решения.
Разрабатывать по принципу обратной совместимости и не удалять старые пакеты (хотя бы месяц) при выкладке.
Сделать Guard для Routing срабатывающий при активации смены routing'а с проверкой текущей версии и в случае несовпадения перезагружать страницу. Не забывайте что backend тоже может измениться
Вот это интересная идея. Делать проверку версии, а далее, если версия отличается, просто делать reload приложения с выводом сообщения вроде: "Обновление приложения" (или подобное). Таким образом и ошибку обходим, и пользователя уведомили в чем причина. Спасибо :)
Подожду еще, может чего напишут, но как вариант решения отмечу обязательно ;)