为什么想要这个入口
博客写了几年,文章攒了不少,但首页永远只露出最近那几篇。我自己翻旧文都得靠搜索或者翻归档,更别说偶尔来的读者。有天晚上我想找一篇两年前写的折腾记录,翻了半天没找到,突然觉得:这些旧东西不该就这么沉底。
我想要一个按钮,点一下,随机跳到一篇旧文。不用多聪明,能把我自己带回某个时间点就行。
先想清楚随机什么
第一反应是随机所有文章,但试了一下,新文章本来就在首页,随机到它们没意思。我想让这个入口专门挖旧文,所以得加个时间过滤:只从发布超过一定天数的文章里随机。
这个天数我设成了 90 天。没什么科学依据,就是觉得三个月前的东西已经不太会被翻到了。后来想,这个阈值其实可以做成配置项,但一个人用的博客,先写死就行。
静态站怎么随机
我的博客是静态生成的,没有后端。最直接的做法是在构建时把所有旧文的 URL 塞进一个数组,前端点击时用 JavaScript 随机取一个跳转。
具体怎么拿到旧文列表,取决于你用的生成器。我用的是自己写的一个小脚本,从文章目录里读文件,按 front matter 里的日期过滤。如果你用 Hugo 或 Eleventy,都有现成的模板变量可以遍历,加个日期判断就行。
关键一步:把结果输出成一个 JSON 文件,比如 /random-old-posts.json,内容就是一个字符串数组。这样前端 fetch 一次就能拿到所有候选链接。
按钮和跳转
按钮放在侧边栏或者文章末尾都行,我放在了侧边栏底部,文案就写“随便翻一篇旧文”。
前端逻辑很简单:点击时 fetch 那个 JSON,随机取一个 URL,然后 window.location.href 跳过去。为了防止重复点击导致请求过多,可以加个 loading 状态,但说实话,一个人博客的流量,这点请求根本不算什么。
有个细节:如果 fetch 失败(比如文件没生成),按钮应该静默失效还是给个提示?我选了后者,弹一个简单的 alert,至少知道出问题了。
一点小改进
上线之后我自己点了十几次,发现随机到的文章有时候是同一篇连着出现。纯随机就是这样,会有重复感。后来我加了个简单的“不重复”逻辑:把上次随机的 URL 存到 sessionStorage,如果这次随机到同一个,就再随机一次。
就这么个小功能,花了我一个晚上,但每次点它跳出一篇自己都快忘了的文章,感觉像在翻旧相册。有时候写博客的乐趣就在这些边角料上。


