Skip to main content

博客大升级 v2.0:从单调到丰富的全站优化之旅

My blog journey.webp
Published on
/
9 mins read

写在前面

距离上次写博客搭建文章已经过了几个月了。这段时间里,我一直在用这个博客写文章、记录生活,但总觉得少了点什么——功能太单调了,读者体验也不够好。

于是趁着周末,我决定给博客来一次大升级。没想到这一改就停不下来了,最后做了 50+ 项改进,涉及 70+ 个文件,提交了 9 次 commit

这篇文章记录一下这次升级的过程,包括做了什么、怎么做的、踩了哪些坑。

为什么要升级

说实话,之前的博客虽然能用,但有几个问题一直困扰我:

  1. 功能单调 — 除了写文章和评论,没有其他互动方式
  2. 搜索不够好 — kbar 搜索只能匹配标题,不能搜文章内容
  3. 分享不方便 — 想分享给朋友,只有几个国外平台的按钮
  4. 阅读体验一般 — 字体大小固定,没有专注模式
  5. MDX 组件太少 — 写技术文章时想用 Tabs、Steps 这些组件,但没有
  6. 有几个 Bug — 图片放大不了、一言不刷新、有测试数据残留

所以这次的目标很明确:让博客从"能用"变成"好用"

这次做了什么

🐛 Bug 修复(4 项)

  • 修复了 trusted-devices.json 被意外提交到 Git 的安全问题
  • 实现了一言(Hitokoto)30 秒自动刷新 + 淡入淡出动画
  • 清理了 Moments 里的测试数据
  • 移除了代码块的 Run 按钮(Sandpack 加载太不稳定了)

📦 MDX 组件库(15 个新组件)

这是这次升级最大的工作量。我一口气做了 15 个 MDX 组件:

组件用途
Callout提示框(info/tip/warning/error/success)
Tabs选项卡(多语言代码对比)
Steps步骤指南(带时间线)
Accordion折叠面板(FAQ)
ComparisonTable对比表格(✅/❌)
Timeline时间线
FileTree文件目录树
Terminal终端输出
Kbd键盘按键
GitHubCardGitHub 仓库卡片
BeforeAfter图片对比滑块
ChartSVG 图表
VideoB站/YouTube 嵌入
MathNumber公式编号

🔍 Pagefind 全文搜索

这是我最满意的功能之一。Pagefind 在构建时自动索引所有文章内容,支持中文分词,搜索速度极快。

📖 阅读体验增强(6 项)

  • 字体大小控制(S/M/L 三档)
  • 专注阅读模式(隐藏所有干扰)
  • 阅读位置记忆(下次打开恢复位置)
  • 文章语音朗读(Web Speech API)
  • 文章难度标签
  • 归档时间线页面

🔗 社交分享(7 渠道)

微信(二维码)、QQ、微博、X、Telegram、Reddit、复制链接。移动端优先使用系统原生分享。

🎨 视觉与动画

  • 页面切换动画(View Transitions API)
  • 终端风格 404 页面(打字机效果)
  • 暗色模式切换动画(圆形扩散)

📱 移动端优化

  • 左右滑动切换文章
  • PWA 安装提示
  • 下拉刷新动画

🔧 其他改进(15+ 项)

键盘导航 J/K、拼音搜索、KaTeX 公式复制、Mermaid 图表放大、TOC 折叠记忆、文章卡片入场动画、代码块增强(行号/文件名)等等。

技术亮点

Pagefind 全文搜索

Pagefind 的集成非常简单。只需要在 postbuild 脚本中加一行:

bash
npx pagefind --site out --glob "**/*.html"

它会自动扫描所有 HTML 页面,生成搜索索引。在文章内容区域加上 data-pagefind-body 属性,就能精确控制索引范围:

tsx
<div className="prose" data-pagefind-body>
  {children}
</div>

搜索结果支持中文分词,虽然不支持词干提取(stemming),但对于博客搜索来说完全够用了。

MDX 组件示例

有了这些组件,写技术文章方便多了。比如:

mdx
<Callout type="tip" title="小贴士">
  使用 `pnpm``npm` 快很多,而且节省磁盘空间。
</Callout>
 
<Tabs items={['pnpm', 'npm', 'yarn']}>
  <Tab value="pnpm">pnpm install next</Tab>
  <Tab value="npm">npm install next</Tab>
  <Tab value="yarn">yarn add next</Tab>
</Tabs>
 
<Steps>
  <Step title="安装依赖">运行 pnpm install</Step>
  <Step title="启动开发">运行 pnpm dev</Step>
  <Step title="构建部署">运行 pnpm build</Step>
</Steps>

液态玻璃设计统一

这次把所有组件都统一到了液态玻璃设计系统。四个层级:

  • liquid-glass — 标准卡片
  • liquid-glass-elevated — 弹出层/模态框
  • liquid-glass-subtle — 次要元素
  • liquid-glass-input — 表单输入

所有新组件都遵循这个规范,确保视觉一致性。

View Transitions 页面动画

利用浏览器原生的 View Transitions API,实现了页面切换时的平滑过渡。不支持的浏览器会自动降级为普通跳转,不影响功能。

遇到的坑

1. Cloudflare Pages 不支持原生模块

一开始我想用 @xenova/transformers 在构建时跑本地 AI 模型来做语义搜索。结果发现 CF Pages 的构建环境不支持 onnxruntime-node(原生 C++ 模块)。

最后放弃了 AI 方案,改用 Pagefind + 标签权重算法。对于我目前不到 10 篇文章的规模,效果其实差不多。

2. Sandpack 加载不稳定

代码块的"Run"按钮用的是 CodeSandbox 的 Sandpack,但不管开不开加速器都经常加载失败,一直转圈。最后决定直接移除这个功能。

3. overflow-hidden 阻止图片缩放

react-medium-image-zoom 的放大效果被父容器的 overflow-hidden 给裁剪了。解决方法很简单——把 overflow-hidden 去掉就行。

4. Safari 隐私模式 localStorage 报错

Safari 的隐私浏览模式下,localStorage.setItem() 会直接抛异常。所有用到 localStorage 的地方都需要 try/catch 包裹。

数据统计

指标数字
总改进项50+
新增 MDX 组件15 个
Git 提交9 次
涉及文件70+
新增代码行~3000 行
分享渠道7 个

下一步

  • 📝 继续写文章,记录学习和生活
  • 🎓 准备高考(这才是正事!)
  • 🔧 根据实际使用情况继续打磨细节
  • 📊 观察 Pagefind 搜索的实际效果

总结

做博客就像种花——你不能指望种下去第二天就开花,需要持续浇水、施肥、修剪。每次升级都是一次"施肥",让博客变得更好一点。

这次 v2.0 升级让我学到了很多:

  • 不要过度工程化 — 一开始想用 AI 模型,后来发现简单算法就够用
  • 用户体验很重要 — 小细节(如字体控制、位置记忆)能大幅提升阅读感受
  • 保持一致性 — 液态玻璃设计系统让所有组件看起来是一个整体
  • 渐进增强 — 新功能不支持就降级,不影响基本使用

好了,该去复习了。高考加油!💪