答案是否定的,缓存机制到处都存在,为了提高性能,有客户端缓存,服务端缓存,代理服务器缓存等
但是对于我们前端而言,http缓存是我们前端可以接触到并实际使用的web性能优化手段
(1)减少网络带宽消耗
无论对于网站运营者或者用户,带宽都代表着金钱,过多的带宽消耗,只会便宜了网络运营商。当Web缓存副本被使用时,只会产生极小的网络流量,可以有效的降低运营成本。
(2)降低服务器压力
给网络资源设定有效期之后,用户可以重复使用本地的缓存,减少对源服务器的请求,间接降低服务器的压力。
(3)减少网络延迟,加快页面打开速度
答案是肯定的,对于最终用户,缓存的使用能够明显加快页面打开速度,达到更好的体验。
命中缓存
没有命中缓存
使用场景

status为灰色的是强制缓存,分为两种from memory cache 和 from disk cache,浏览器会优先读取内存中的数据
配置参数
如果两个参数都存在的话,Cache-Control 优先级大于Expires
是否缓存依赖于接口响应头里面设置的参数(其实对于前端来说,操作有限,了解可以针对一些特定场景来解决问题)
下面是一个使用Nginx作为Web服务器的缓存配置
location / {
# 其它配置 ...
if ($request_uri ~* .*[.](js|css|map|jpg|png|svg|ico)$) {
#非html缓存1个月
add_header Cache-Control "public, max-age=2592000";
}
if ($request_filename ~* ^.*[.](html|htm)$) {
#html文件使用协商缓存
add_header Cache-Control "no-cache";
}
配合webpack打包 contenthash的方案
hash 计算与整个项目的构建相关;
chunkhash 计算与同一 chunk 内容相关;(js和css在同一个chunk)
contenthash 计算与文件内容本身相关.(文件内容发生改变,contenthash就会改变)
module.exports = {
output: {
// 文件hash
filename: '[name].[contenthash].js',
},
optimization: {
moduleIds: 'deterministic',//避免因为模块解析顺序发生变化而导致文件 hash 值改变
// runtime 单独打包为一个 chunk
runtimeChunk: 'single',
splitChunks: {
cacheGroups: {
// 第三方包打包为 vendors chunk,因为很少修改,有利长期缓存
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chunks: 'all',
},
},
},
},
};
大厂的解决方案(B站)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jjedp6jd-1656411814643)(C:\Users\xiaziwei\AppData\Roaming\Typora\typora-user-images\image-20220627174947855.png)]](https://1000bd.com/contentImg/2022/06/29/092720391.png)