作者: Priyen Mehta | Senior Full-Stack Developerhttps://medium.com/javascript-in-plain-english/frontend-caching-the-most-underrated-performance-technique-nobody-talks-about-7f4f207d0ce0
如果你问前端开发者如何提升性能,最常见的回答通常是:
“用 lazy loading……”“优化图片……”“用 React memo……”“拆分 bundle……”这些都没错,也都很重要——但几乎没有哪一项,能像合理的缓存一样,带来如此巨大的性能提升。
缓存是前端世界中杠杆率最高的性能工具,但同时也是最容易被误解、使用率最低的一个。很多开发者认为缓存是“后端团队该管的事”,结果就是:90% 的前端应用发起了远远超出必要数量的网络请求。
在这篇文章中,我们将拆解前端缓存真正的威力,讲清楚如何正确使用缓存,以及它如何帮你节省带宽、时间、成本,并减少大量用户的挫败感。
大多数前端工程师都会忽略一件事:
在第一次 API 请求之前,每节省 1ms,都会对用户的感知性能产生指数级提升。
想想这些常见的用户行为:
重新打开页面切换标签页刷新信息流在不同路由之间跳转如果你的前端在数据没有变化的情况下,每次都重新请求后端,你消耗的其实是:
用户时间后端成本移动端流量电池电量CPU 周期而这一切,几乎毫无意义。
前端缓存可以非常优雅地解决这个问题——而且几乎是立竿见影。
1. Browser Cache —— 被忽视最多的性能加速器浏览器本身已经为你提供了一层非常强大的缓存能力,用于缓存:
静态资源HTMLJS bundles字体图片但真正的“魔法”只有在服务器设置了正确的响应头时才会生效。
Cache-Control 示例:
Cache-Control: public, max-age=31536000, immutable这会告诉浏览器:
“把这个资源缓存 1 年”“除非文件名变化,否则不要重新下载”“每次都可以安全复用这个版本”这也是为什么像 YouTube、Meta、Twitter 这样的网站,在首次访问后几乎是“秒开”。
什么时候不该用
HTML 文档不要缓存,一定要保持非缓存状态:
Cache-Control: no-store这样可以避免新版本发布时,用户仍然看到旧的 UI。
2. Memory Cache —— 应用内最快的“RAM”这种缓存发生在你的应用内部(React、Vue、Svelte)。
一旦你把 API 返回的数据存进内存,它就可以在:
多次 rerender 之间复用页面跳转之间复用有时甚至跨组件复用示例:简单的 React Memory Cache
let _cache = {};export async function fetchCached(url) { if (_cache[url]) return _cache[url]; const res = await fetch(url); const data = await res.json(); _cache[url] = data; return data;}突然之间,第二次加载变成了:
0ms无网络请求无等待你会惊讶地发现,有多少应用连这一步都没做。
3. LocalStorage / SessionStorage —— 持久化缓存适合以下场景:
数据几乎不变用户经常回访需要离线能力页面 reload 不应该触发 API 请求⭐ 示例:缓存 API 响应 24 小时
const KEY = "dashboard-stats";const EXPIRE = 24 * 60 * 60 * 1000;export async function getDashboardStats() { const cached = JSON.parse(localStorage.getItem(KEY) || "null"); if (cached && Date.now() - cached.time < EXPIRE) { return cached.data; } const res = await fetch("/api/stats"); const data = await res.json(); localStorage.setItem( KEY, JSON.stringify({time: Date.now(), data}) ); return data;}即使刷新页面,UI 也能瞬间加载完成。
4. Service Workers —— 浏览器的缓存超能力如果你想要最高级别的控制能力,Service Workers 就是王者。
你可以获得:
离线模式stale-while-revalidate优化的预取(prefetch)后台同步对 Cache API 的完全控制示例:使用 SW 缓存 API
self.addEventListener("fetch", (event) => { event.respondWith( caches.match(event.request).then((cached) => { const networkFetch = fetch(event.request).then((res) => { caches.open("v1").then((cache) => cache.put(event.request, res.clone()) ); return res; }); return cached || networkFetch; }) );});这会让你的应用变得:
极其快速行为高度一致在弱网环境下表现完美如果你在构建现代 PWA —— 一定要用。
5. HTTP 层缓存:ETags + Stale-While-Revalidate大多数前端应用在这里都做错了:
请求数据 → 后端返回完整新数据 → 浏览器每次都重新下载
而使用 ETags + SWR 后,浏览器和后端之间的交互是这样的:
流程:
浏览器:“这是我已有资源的 ETag,有变化吗?”后端:“没变化 → 返回 304 Not Modified”浏览器:立刻使用本地缓存的响应只有在内容变更时,后端才返回新的 payload结果:
加载速度提升 10× 带宽消耗减少 70–95% 后端压力大幅下降
示例响应头:
Cache-Control: max-age=0, must-revalidateETag: "abc123"6. 框架级缓存:SWR、TanStack Query、Apollo Cache现代前端框架已经内置了非常强大的缓存能力。
➤ React + SWR
const { data } = useSWR('/api/user', fetcher, { revalidateOnFocus: false,});➤ React Query(TanStack Query)
useQuery(["todos"], fetchTodos, { staleTime: 1000 * 60 * 5, // 5 minutes});这会带来:
智能缓存后台同步自动 stale 失效optimistic UI大量应用在每次路由切换时都会重新 fetch 所有数据——这些库可以非常优雅地解决这个问题。
7. Prefetching、Preloading & Prerendering —— 看不见的缓存Google、Amazon、Netflix 都在用这一套。
Prefetch:“用户可能很快会点这里”
<link rel="prefetch" href="/next-page">Preload:“这个资源很关键,现在就要加载”
<link rel="preload" href="hero-image.jpg" as="image">Prerender:“在后台把整个页面都加载好”
<link rel="prerender" href="/checkout">这会让下一次导航的体验几乎是瞬间完成。
8. CDN 缓存 —— 最强大的缓存层你的 CDN(Cloudflare、Fastly、Akamai、Vercel)可以提供:
边缘缓存(edge caching)边缘层的 stale-while-revalidate动态回退缓存全球分布式读副本示例:
Cache-Control: public, max-age=60, stale-while-revalidate=120即使在拉取新数据的过程中,用户也能立刻拿到响应。
正确配置 CDN,可以为公司节省数百万的基础设施成本。
示例 1 —— Dashboard 加载速度提升 5×一个在每次路由变化时都会刷新的 dashboard。加入 memory + storage 缓存后,网络请求减少了 83%,加载时间从 1.8s 降到 350ms。
示例 2 —— 移动端应用节省 40% 用户流量通过 LocalStorage 缓存 + ETag 校验,避免了重复列表数据的下载。
示例 3 —— 一个严重的前端安全问题不当的缓存策略可能会暴露敏感数据(例如:被公开缓存的鉴权页面)。
总结前端缓存并不只是“一个优化手段”。
它是前端开发者能使用的、最强大、影响最大、却最常被忽视的性能策略之一。
如果实现得当,缓存可以:
将加载时间减少 70–90%显著降低后端请求数量让应用拥有“瞬开”的体验节省用户带宽改善离线体验降低服务器成本在正确使用的前提下提升安全性下次做性能优化时,不要一开始就盯着 bundle 体积和 lint 规则。
先问一个问题:
“哪些东西可以缓存?”
因为在前端性能领域,缓存不是事后优化——它是一种超能力。
转载请注明来自海坡下载,本文标题:《前端图片优化(前端缓存最被低估的性能优化技巧)》
京公网安备11000000000001号
京ICP备11000001号
还没有评论,来说两句吧...