react系统更新后需要手动清除缓存问题
Web缓存是指一个Web资源(如HTML页面、图片、JS、数据等)存在于Web服务器和客户端(浏览器)之间的副本。一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,并且由于缓存文件可以重复利用,还可以减少带宽,降低网络负荷。
遇到问题: 每次部署更新web系统后,需要手动清除浏览器缓存才能更新到最新页面,对用户来说既不能及时感知到系统已经更新,使用过程中可能会出现系统异常情况,亦或是知道系统已经更新,还需要记住要清除缓存才能够实现更新,增加用户的记忆负担,无论是哪一种,给用户的体验都很差,这里针对react的开发项目提出以下解决措施:
解决措施 | 方法描述 |
---|---|
版本化文件名 | 在打包构建时,使用文件内容的哈希值作为文件名的一部分,这样每次代码发生变化时,文件名都会改变,浏览器就不会从缓存中获取旧版本的代码。在React中,可以使用Webpack或者Create React App等构建工具来实现版本化文件名。 |
HTTP缓存头 | 通过在HTTP响应头中设置Cache-Control,Expires等缓存控制头,来告诉浏览器缓存策略。例如,可以将Cache-Control设置为max-age=0,这样浏览器每次都会请求最新的页面和资源。 |
Service Worker | 在React应用中注册一个Service Worker,可以使得缓存控制更加灵活。你可以定义缓存策略,甚至离线支持等特性。但是需要注意的是,Service Worker是一个强大的API,需要仔细考虑它的影响。 |
实际操作: 这里只对版本化文件名的方式进行演示,在部署的时候当然可以每次通过变更文件路径来解决这类问题,但这样会无形增加运维的工作量而且也容易出问题,这里介绍使用Webpack构建工具来实现版本化文件名解决这个问题,按以下步骤进行操作
- 在项目根目录下安装webpack和webpack插件:
npm install webpack --save-dev
npm install webpack-manifest-plugin --save-dev
- 在webpack配置文件(一般是webpack.config.js)中引入webpack-manifest-plugin插件:
const ManifestPlugin = require('webpack-manifest-plugin');
- 在plugins配置中添加ManifestPlugin实例(如果打包报错则去除部分):
module.exports = {
// 其他配置项...
plugins: [
new ManifestPlugin()
]
};
- 对输出的文件名进行配置,使用指纹(hash)作为文件名的一部分:
module.exports = {
// 其他配置项...
output: {
filename: '[name].[contenthash].js',
// 可选:如果有单独的CSS文件,也可以将CSS文件名设置成带有指纹的形式
// 如果使用了ExtractTextWebpackPlugin等插件提取CSS文件,需要相应的插件支持
// 如:filename: '[name].[contenthash].css',
},
};
-
运行Webpack打包命令,生成带有版本化文件名的输出文件。
-
部署完记得重启服务!!!!!!!!!!
这样就可以不再需要用户手动清除浏览器缓存也可以实现前端页面的更新,如果想进一步深入了解webpack处理文件名hash的问题,可以参考引用的第二篇文献,虽然我觉得写的乱七八糟,根本看不下去,但没有找到更好的。
相关文章: