У меня есть AngularJs (1.7) SPA с Webpack (4.x).
Вот как мы создаем имена чанков:
config.output = {
path: PATHS.build,
publicPath: '/dist/',
filename: `[name]${isDev ? '' : '.[contenthash:8]'}.bundle.js`,
chunkFilename: `chunks/[name]${isDev ? '' : '.[contenthash:8]'}.chunk.js`
};
Ленивая загрузка выполняется в определениях состояний в ui-router, в основном так:
$stateProvider
.state('reports', {
url: '/projects/:project_id/reports',
lazyLoad: function($transition$) {
const injector = $transition$.injector().get('$injector');
return import(/* webpackChunkName: "admin.reports.module" */ './reports')
.then(mod => {
injector.loadNewModules([mod.default]);
})
.catch(err => {
throw new Error('An error occured, ' + err);
});
}
})
После развертывания из-за изменений модуля в «динамическом» чанке - имя файла будет изменено в этом чанке ([contenthash] изменился).
Когда вошедший в систему пользователь (куда загружаются все связанные ресурсы до последнего развертывания) теперь пытается открыть маршрут с новым чанком - чанка нет (404), и он завершится с ошибкой :
Transition Rejection($id: 4 type: 6, message: The transition errored, detail: Error: An error occured, Error: Loading chunk 14 failed.
(error: admin.reports.module.8fc31757.chunk.js))
Есть ли общий способ обойти / справиться с этим?
Может быть, в целом: как можно обнаружить изменения в комплекте веб-приложения? Есть ли общий способ вызвать перезагрузку? Всегда ли требуется ручное обновление?