要说最基础的缓存控制,肯定绕不开HTTP缓存头。Expires和Cache-Control这两个老伙计,相信大家都用过。Cache-Control的max-age设置个31536000秒(一年),静态资源基本就安分了。不过要注意啊,现在Expires已经被Cache-Control取代了,毕竟相对时间比绝对时间靠谱得多。

但光靠HTTP缓存还不够灵活,这时候就得请出前端存储三剑客:Cookie、Web Storage和IndexedDB。Cookie虽然能存点小数据,但每个请求都带着它,流量浪费不说,还有安全风险。后来HTML5带来了localStorage和sessionStorage,这俩用起来是真方便,localStorage.setItem('key', 'value')就能把数据存到本地,5MB的容量存些用户配置绰绰有余。

说到实际应用,缓存策略得根据资源类型来定。像vue.js、react.js这种不怎么变的库文件,直接设置成强缓存最省事。但经常更新的业务代码,就得用协商缓存了,通过etag或者last-modified让服务器判断要不要返回新内容。

最近在做PWA项目,Service Worker的缓存机制让我打开了新世界。它能在客户端和服务器之间做个代理层,完全由JS代码控制缓存逻辑。比如说,我们可以实现“网络优先”策略,先尝试从网络获取,失败再用缓存;或者“缓存优先”,对图片这类资源特别管用。

不过缓存更新是个头疼问题。我习惯在文件名里加哈希值,比如bundle.a1b2c3.js,内容一变文件名就变,相当于强制更新。或者更精细点,在JS里记录版本号,每次启动检查是否需要更新缓存。

说到缓存失效,这里有个坑要提醒新手。有时候明明更新了资源,但浏览器还是读的旧缓存。这时候可以在请求URL后加时间戳或者随机参数,比如?version=20230618,虽然不能真正缓存,但能保证拿到最新内容。

内存管理也得注意,特别是用IndexedDB存大量数据时。曾经做图片编辑器项目,用户上传的图片都缓存起来,结果内存飙升,页面直接卡死。后来加了LRU(最近最少使用)淘汰机制,只保留最近用过的20张图片,问题才解决。

移动端上的缓存更要小心。iOS Safari的总存储空间才50MB左右,超出限制就直接清空。所以要做容量检测,写缓存前先估算大小,超了就得清理旧数据。

缓存安全也不能马虎。敏感数据千万别放localStorage,很容易被XSS攻击窃取。最好存在sessionStorage里,页面关闭自动清除,或者用HttpOnly的Cookie。

说到性能优化,合理的缓存策略能让首屏加载快不少。关键CSS和内联JS可以直接写在HTML里,非关键资源异步加载并缓存起来。不过要注意,浏览器缓存空间是有限的,Chrome大概能存80%的磁盘空间,但单个源最多只能用掉60%。

最后分享个实战技巧:在Vue项目里,我会把用户权限数据、菜单配置这些不常变但又经常用的数据存到localStorage,并设置过期时间。每次先用缓存数据渲染页面,再悄悄向后端请求最新数据,有变化就更新缓存并重新渲染。这样既保证了加载速度,又能及时更新。

缓存用好了是真香,但也要把握好度。过分追求缓存命中率可能导致用户看不到最新内容,缓存太少又会增加服务器压力。根据业务场景找到平衡点,这才是前端工程师的价值所在。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐