Notion 改了,网站为什么没马上更新?

我在整理博客时遇到过一个问题:Notion 里的内容已经改了,网站却仍然显示旧版本。
最直观的反应是刷新浏览器,或者重新部署。但要判断原因,需要先看内容从 Notion 到网页经过了哪些步骤。

页面和数据,各有自己的缓存

博客通过服务端读取 Notion,再生成文章页面。这里至少有取数缓存与页面缓存:前者保留 API 返回的数据,后者保留生成好的页面。
此前取数函数使用进程内 Map,没有有效期。一旦命中,后续读取可以持续拿到旧数据,直到实例重启或缓存被清除。
所以,页面即使重新生成,也可能仍然使用旧资料。只调整页面的 revalidate,不能让这份没有过期机制的上游缓存自动失效。

现在怎样配合更新

当前代码为取数缓存增加了有效期,默认六十秒,并让页面 ISR 使用相应间隔。
过程可以理解为:
修改 Notion ↓ 后续访问满足刷新条件 ↓ 读取层在缓存过期后请求新数据 ↓ 页面成功重新生成 ↓ 后续请求看到更新
六十秒不是一个固定轮询闹钟。Next.js Pages Router 的 ISR 由访问触发,刷新窗口过后的一次访问可能仍得到旧页面,同时启动后台生成;成功后,后续请求才得到新版。Next.js 13 ISR 文档
因此,没人访问的页面未必会准时更新;多个缓存层与请求耗时,也可能延迟实际显示。对我的博客,可以把一到五分钟当作通常的等待预期,不能把它当成保证。

刷新失败,也不该清空文章

Notion 暂时返回错误时,已有文章应该尽量继续可读。
现在的读取层会抛出错误,而不是把取数失败伪装成空正文。对于已经成功生成的页面,ISR 可以保留旧版本并在后续访问重试。首次生成失败时,则没有旧页面可以回退。
这条行为已经通过本地生产模式的模拟测试检查:更新内容、返回 503、恢复请求,分别观察网页显示。模拟结果与真实线上内容检查,需要分开记录。

“没有出现”也可能与发布条件有关

缓存正常,不代表每条 Notion 记录都会成为公开文章。
当前博客会检查标题、类型、语言、Published 状态和发布日期。草稿与未来日期不会进入公开列表,归档或移入回收站的页面也会排除。
所以,我会先确认发布条件,再检查取数与缓存。如果直接重复部署,可能暂时清掉某层缓存,却没有真正解释问题。

内容更新和代码部署

修改正文、摘要和标签,通常通过现有读取与刷新流程更新;修改组件和读取逻辑,则需要构建并部署代码。
把这两件事区分清楚,能减少写作时的重复操作。后续我还想增加主动刷新入口,但当前不能把它作为已经存在的功能使用。
这次排查让我学到,看到旧页面时,最有用的问题是:当前拿到的是哪一层的旧数据,下一次新数据会在哪里进入流程?找到这一点,刷新策略才有依据。
对于本文内容有任何疑问, 可与我联系.