值得缓存的模板片段是跨页面复用且极少更新的静态结构,如页脚、弹窗、分页组件;而用户昵称、实时订单等强动态内容不宜缓存,需按url参数、用户身份等可变维度切片key,并避免缓存含内联script的片段。

服务端渲染中哪些模板片段值得缓存
不是所有 HTML 片段都适合缓存——缓存价值取决于变化频率和复用广度。静态页脚、通用弹窗、分页组件这类跨页面复用、极少更新的结构,缓存收益最高;而用户昵称、实时订单状态、个性化推荐等强动态内容,缓存反而引入 stale data 风险。
常见错误现象:header 模板被缓存但内部含 ${user.name},结果多个用户看到同一缓存副本;product-list 缓存未按分类或分页参数隔离,导致 /category/shoes?page=2 返回 /category/hats 的缓存结果。
- 必须按“可变维度”切片:带 URL 参数、用户身份、设备类型(如
isMobile)的模板,需将这些值作为缓存 key 的一部分 - 避免缓存含内联
<script></script>的片段:SSR 渲染后 JS 会重复执行,且缓存中 script 标签无法随客户端状态更新 - 缓存粒度宁小勿大:缓存一个
<nav></nav>比缓存整个更安全,出错时影响范围可控
如何为模板碎片设置合理的缓存失效策略
缓存不失效 = 缓存有毒。服务端模板缓存必须绑定明确的失效信号,不能依赖时间 TTL 硬超时——内容变了但缓存没过期,用户就看到旧按钮、404 路由、失效表单。
实操建议:
- 文件变更触发失效:Webpack/Vite 构建时生成
template-hash.json,每次部署更新 hash 值,缓存 key 中包含该 hash - 数据库事件驱动:对 CMS 内容更新,发消息到 Redis Pub/Sub,监听并清对应 fragment key(如
fragment:header:en) - 禁止用
max-age=3600这类固定时长:它掩盖了真实业务节奏,比如首页 Banner 每天 10 点更新,缓存却在凌晨 2 点自动刷新,中间 8 小时空白期全靠 stale 数据撑着
HTML <template></template> 标签在 SSR 场景下的缓存陷阱
很多人把 SSR 输出的 HTML 字符串塞进 <template></template> 标签再注入 DOM,以为能复用浏览器缓存机制——这是误解。<template></template> 是客户端运行时惰性容器,服务端根本不会解析它,也不会参与 SSR 缓存链路。
真正起作用的是服务端模板引擎自身的缓存层(如 Marko 的 compiler cache、Thymeleaf 的 fragment cache),<template></template> 只是客户端拿到 HTML 后的二次处理环节。
- SSR 输出含
<template id="list-item"></template>的 HTML?没问题,但它的缓存行为完全由服务端控制,<template></template>标签本身不改变服务端缓存逻辑 - 若服务端已缓存了完整 HTML,再用 JS 抽出
document.getElementById('list-item').content克隆,实际克隆的是已缓存的旧结构——缓存没清,克隆也没用 - IE 不支持
<template></template>,但 SSR 输出的 HTML 仍需兼容:服务端应根据 User-Agent 切换 fallback 方案(如<script type="text/template"></script>),而非指望客户端降级
CDN 缓存与服务端模板缓存的冲突点
CDN 缓存 HTML 页面时,会把服务端模板缓存的结果一并固化。一旦 CDN 缓存命中,连服务端的缓存失效逻辑都触发不了——你改了数据库、清了 Redis、重启了 Node 进程,用户看到的还是 CDN 边缘节点上那一页旧 HTML。
这不是配置错误,而是架构层级错位:CDN 在 HTTP 层拦截请求,服务端缓存在应用层生效,后者根本没机会运行。
- 关键动作:对所有动态 HTML 路径(如
/user/profile、/search?q=xxx),CDN 必须设为 bypass cache 或设置Cache-Control: no-cache,让请求穿透到源站 - 只允许 CDN 缓存带哈希的静态资源路径(如
/static/app.abc123.js),绝不能缓存/index.html或任何含 query 的 URL - 检查是否生效:抓包看响应头里
Cache-Control是否为no-cache,同时确认 CDN 的x-cache头显示MISS或EXPIRED,而非HIT
缓存层级越深,失效路径越长。服务端模板碎片化缓存只是其中一环,漏掉 CDN 或客户端 Service Worker 的协同,整套策略就形同虚设。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











