我更喜欢让用户手动刷新而不是自动刷新(这样可以防止无限刷新循环错误)。
对于React应用程序,以下策略效果很好,在路由上进行代码分割:
策略
将您的index.html设置为永不缓存。这确保了请求初始资产的主要文件始终是新鲜的(通常它不大,因此不缓存它不应该成为问题)。请参见MDN Cache Control。
为您的块使用一致的块哈希。这样可以确保只有更改的块才会具有不同的哈希值。(请参见下面的webpack.config.js片段)
不要在部署时使CDN的缓存失效,这样旧版本在部署新版本时不会失去其块。
在导航到其他路由时检查应用程序版本,以便在用户运行旧版本时通知他们并请求刷新。
最后,以防发生ChunkLoadError:添加一个错误边界。 (请参见下面的错误边界)
webpack.config.js的片段(Webpack V4)
来自Uday Hiwarale:
optimization: {
moduleIds: 'hashed',
splitChunks: {
cacheGroups: {
default: false,
vendors: false,
// vendor chunk
vendor: {
name: 'vendor',
// async + async chunks
chunks: 'all',
// import file path containing node_modules
test: /node_modules/,
priority: 20
},
}
}
错误边界
React 错误边界文档
import React, { Component } from 'react'
export default class ErrorBoundary extends Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
return { hasError: true, error };
}
componentDidCatch(error, errorInfo) {
console.error('Error Boundary Caught:', error, errorInfo);
}
render() {
const {error, hasError} = this.state
if (hasError) {
return <div>
<div>
{error.name === 'ChunkLoadError' ?
<div>
This application has been updated, please refresh your browser to see the latest content.
</div>
:
<div>
An error has occurred, please refresh and try again.
</div>}
</div>
</div>
}
return this.props.children;
}
}
注意:确保在内部导航事件(例如使用react-router时)清除错误,否则错误边界将在内部导航之后继续存在,并且只有在实际导航或页面刷新时才会消失。