我已发布但应用仍显示旧翻译

您已发布新翻译但应用仍显示旧翻译。这几乎总是缓存问题——了解如何诊断和解决。

5 分钟阅读·中级

您已发布新翻译,但应用仍显示旧翻译。这几乎总是缓存问题——以下是诊断和解决的方法。

了解缓存层

发布后,翻译在到达用户之前会经过多个缓存层:

您发布
  → 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 响应头显示 HITMISS

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 缓存。如果您怀疑清除未生效(罕见),可以验证:

  1. 直接从 CDN 获取翻译
  2. 检查响应正文中您的新翻译值
  3. 如果是陈旧数据,等待 60 秒(CDN max-age: 60 将自然过期)

注意: CDN 设计为始终返回 HTTP 200,即使在错误时也是如此。如果您看到 {}{ "fallback": true },表示翻译尚未发布(不是缓存问题)。

何时需要担心

如果翻译在 5 分钟后仍然陈旧:

  1. 检查控制台——发布是否真的完成了?
  2. curl 直接验证 CDN URL
  3. 检查您的项目 ID 是否完全匹配(区分大小写)
  4. 运行 better-i18n doctor 获取诊断信息

下一步