【发布时间】:2019-04-04 14:10:24
【问题描述】:
我有一个带有 Webpack (4.x) 的 AngularJs (1.7) SPA。
这就是我们创建块名的方式:
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))
有没有一种通用的方法来规避/处理这个问题?
也许更笼统地说:如何检测捆绑网络应用程序的更改?是否有触发重新加载的常用方法?是否总是需要手动刷新?
【问题讨论】:
标签: javascript angularjs webpack angular-ui-router webpack-4