- Published on
解决 Next.js + TinaCMS + SSG 页面更新缓存问题
- Authors
- Name
- Tails Azimuth
问题背景
在开发一个使用 Next.js + TinaCMS 的项目时,我遇到了一个令人困扰的问题:通过 TinaCMS 可视化编辑器修改内容后,前端页面无法正常更新,始终显示旧的内容。这个问题在 SSG(静态站点生成)模式下尤为明显。
问题分析
这个问题的根本原因在于多层缓存机制的冲突:
- Next.js ISR 缓存:Next.js 的增量静态再生成会缓存页面
- TinaCMS 构建缓存:TinaCMS 在构建过程中会生成自己的缓存
- 浏览器缓存:浏览器端的网络缓存策略
- 构建工具缓存:构建过程中产生的临时缓存文件
当内容通过 TinaCMS 更新后,这些缓存层没有正确失效,导致页面显示过期内容。
解决方案
经过反复测试和调试,我总结出了以下 4 步解决方案:
1. 启用页面重新验证 (Revalidate)
首先需要在 Next.js 页面中正确配置 revalidate
选项:
// pages/[...slug].js 或 app/[...slug]/page.js
export async function getStaticProps({ params }) {
// 获取页面数据
const pageData = await getPageData(params.slug)
return {
props: {
pageData,
},
// 设置重新验证时间(秒)
revalidate: 1, // 1秒后允许重新生成
}
}
或者在 App Router 中:
// app/[...slug]/page.js
export const revalidate = 1 // 1秒
export default async function Page({ params }) {
const pageData = await getPageData(params.slug)
return <PageComponent data={pageData} />
}
2. 优化 TinaCMS 构建命令
修改 TinaCMS 构建脚本,跳过客户端构建但保留构建缓存:
# 正确的 TinaCMS 构建命令
tina build --no-client-build-cache
或者在 package.json 中配置:
{
"scripts": {
"tina:build": "tina build --no-client-build-cache",
"build": "tina build --no-client-build-cache && next build"
}
}
参数说明:
--no-client-build-cache
:跳过客户端构建但保留构建缓存,这样可以加快构建速度同时避免客户端缓存问题
3. 设置网络优先策略
在 TinaCMS 获取数据时设置网络优先策略:
const aboutPageResponse = await client.queries.aboutPageConfigConnection(
{},
{
fetchOptions: { fetchPolicy: 'network-only' },
}
)