您已发布新翻译,但应用仍显示旧翻译。这几乎总是缓存问题——以下是诊断和解决的方法。
了解缓存层
发布后,翻译在到达用户之前会经过多个缓存层:
您发布
→ CDN origin 更新(立即)
→ CDN 边缘缓存清除(立即)
→ SDK 内存缓存过期(最多 60 秒)
→ 浏览器/框架缓存过期(最多 60 秒)
→ 用户看到新翻译
在大多数配置中,从发布到用户看到更新的最大延迟约为 60 秒。
快速修复
1. 等待 60 秒并强制刷新
最简单的修复方法:等一分钟,然后按 Cmd+Shift+R(Mac)或 Ctrl+Shift+R(Windows)绕过浏览器缓存。
2. 验证 CDN 有新鲜数据
curl -I https://cdn.better-i18n.com/your-org/your-project/en/translations.json
检查 Age 响应头——如果为 0 或很低,CDN 有新鲜数据。x-cache-status 响应头显示 HIT 或 MISS。
3. 清除 SDK 缓存(开发环境)
如果您在开发中需要立即看到更改,可以通过重启开发服务器来绕过 SDK 的 TtlCache。
各框架的具体行为
Next.js(ISR)
Next.js ISR 添加了自己的缓存层。使用默认的 messagesRevalidateSeconds: 30,Next.js 从 CDN 重新 fetch 最多需要 30 秒。
在开发中强制立即刷新:
- 重启开发服务器,或
- 添加
?_vercel_no_cache=1绕过 ISR 缓存
在生产中: ISR 基于 stale-while-revalidate 工作。30 秒后的第一个请求触发后台重新验证。下一个请求获得新鲜数据。
React SPA / TanStack
SDK 的 TtlCache 有 60 秒 TTL。60 秒后,下一个渲染周期获取新鲜翻译。
Expo / React Native
移动应用也使用 60 秒 TTL。强制关闭并重新打开应用会触发新鲜 fetch。如果启用了持久存储,SDK 在每次成功的 CDN fetch 时会将新鲜数据写入存储。
Remix / Hydrogen
基于 loader 的 fetch 意味着每个服务器请求都可以获得新鲜数据。SDK 的 TtlCache 是主要缓存层(60 秒)。
清除验证
发布时,平台会自动清除 CDN 缓存。如果您怀疑清除未生效(罕见),可以验证:
- 直接从 CDN 获取翻译
- 检查响应正文中您的新翻译值
- 如果是陈旧数据,等待 60 秒(CDN
max-age: 60将自然过期)
注意: CDN 设计为始终返回 HTTP 200,即使在错误时也是如此。如果您看到
{}或{ "fallback": true },表示翻译尚未发布(不是缓存问题)。
何时需要担心
如果翻译在 5 分钟后仍然陈旧:
- 检查控制台——发布是否真的完成了?
- 用
curl直接验证 CDN URL - 检查您的项目 ID 是否完全匹配(区分大小写)
- 运行
better-i18n doctor获取诊断信息