跳到正文

一个个人博客,为什么最后被我做成了桌面写作工具 ​

我原本只想把博客搭起来;后来为了让它顺手,顺路把 CI/CD、主题重构、Tauri 和 Rust 都折腾了一遍。

一开始我以为博客是这样的:

选个静态站生成器,挑个主题,写 markdown,推 GitHub,完事。

做完之后回头看 git log:6 次"修复构建"、3 次主题重构、1 个 Electron 桌面工具、1 次 Tauri 重写,半年没了。不亏,但要算清楚账。

这篇写成四个决策点,每个都写:当时的选择、依据、事后看对不对。


决策 1:用 VitePress + Teek 起步 ​

  • 选择:VitePress + Teek 主题。
  • 依据:几小时就能跑起来。pnpm install、pnpm docs:dev,浏览器打开 5173 端口,hero、文章列表、tag 云、分类全部默认带。
  • 事后:对,但"看起来只差写文章"是错觉。

决策 2:部署到 Cloudflare Pages ​

  • 选择:Cloudflare Pages。
  • 依据:免费 + 全球 CDN。
  • 事后:踩了连续的坑。git log 里的"修复构建"commit 是这样的:
commit干啥
10c31c2pnpm approve-builds 让构建脚本能跑
90a9cfd撤掉一个无效的 --allow-scripts 选项
ab92610修 CI 构建失败:更新 lockfile + 加 pnpm 配置
f06d9be审批 esbuild 构建脚本
2c6d92b审批 Cloudflare 的 workerd 构建脚本
ee1782cCloudflare Pages 项目名打错了

每一次都是推上去、失败、看日志、改一行、再推、又失败。第一次部署成功时我看了 3 秒页面就关掉了,没成就感,只想"为啥这么麻烦"。

但这一坑值得:我现在知道 pnpm 默认不让陌生包跑 postinstall 脚本,知道 Cloudflare Pages 走 workerd,知道项目名不能含大写。下次起新站,30 分钟就能上线。6 次构建是一次"把 CI/CD 流程吃透"的学费。

决策 3:把默认主题改成自己的 ​

  • 选择:反复重构主题组件。
  • 依据:Teek 默认主题挺漂亮,但不是"我"的博客,它是别人的模板。
  • 做了什么:改首页 hero 区、作者卡(HomeBoard.vue → BloggerSidebar.vue)、about 页(AboutProfile.vue)、文章列表(ArticleList.vue)、全局样式(style.css)。git log 里至少 3 次大重构(089fd36、56c68c4、d1fe3bf),每次都是写到一半发现"这个组件设计不对",重新拆。
  • 事后:没浪费。最后这套组件长成现在的样子:左侧自写的作者侧边卡 + 右侧 hero + spotlight + 文章列表,没有一个组件是 Teek 默认的。每次改完都"更像我自己的博客"。

决策 4:写作流程自动化 ​

起因:写文章本身才是痛点 ​

主题搞定后我以为终于能专心写了,但第一篇写到一半我意识到:写 markdown 本身没问题,问题是写完之后的那些事。

完整流程是 7 步:

1. cd docs/articles/
2. 新建 some-slug.md
3. 写 frontmatter(title / description / date / tags / categories / cover)
   ↑ 每次都要回去翻别的文章抄字段名
4. 截图 → 命名 → 拖到 docs/public/images/
   ↑ 命名得想个不冲突的
5. 在 markdown 里插 ![](/images/xxx.png)
   ↑ 路径要 URL encode
6. 整理段落、补 alt、检查链接
7. git add . && git commit -m "..." && git push

每步都不难,加起来很烦。最不想做的是补 frontmatter:脑子在故事里,让我跳出来去填 tags: [信息差, 通勤, 出行优化] 完全打断思路。

第一版:Electron 写作助手 ​

  • 选择:Electron。
  • 设计原则(到现在还在生效):
    1. 零摩擦写作:粘图、拖图、粘文本,都不弹框问元数据,直接落盘、直接插入,元数据先留空。
    2. 元数据后置:frontmatter、图注、alt 通过"整理"按钮事后补,不在写作中途索取。
  • 工具栏只有 4 个按钮:新建 → 写作 → 整理 → 发布。
  • 事后:能 work,用了几周,但有四件事让我难受。

第二版:重写成 Tauri ​

我决定重写,四个理由:

  1. 安装包大:就是一个写文章的小工具,打包出来 80+ MB,绝大部分是 Chromium。
  2. 内存占用高:后台挂着写作助手,单进程几百 MB。我习惯同时开 VS Code、浏览器十几个 tab、微信,再加这个就开始风扇响。
  3. 启动慢:双击图标到能写字之间,能停顿一两秒。每天打开几次,每次都"等一下"。
  4. 想学 Rust:这条最诚实。我不是被迫迁的,是正好想找个项目摸 Rust。

Tauri 的特点:不内嵌 Chromium,用系统 WebView,安装包能砍到几 MB;Rust 后端 + 任意前端框架(我选 React + Tailwind + CodeMirror);启动快、内存低、跨平台。

新结构:

src-tauri/         <- Rust 后端
  └── src/lib.rs   <- 952 行,15 个 #[tauri::command]
src/               <- React 前端
  ├── App.tsx          <- 477 行,主状态机
  ├── components/      <- Editor / Preview / Sidebar / Toolbar / 各类 Dialog
  └── lib/
      ├── tauri.ts     <- IPC 接口封装
      └── formatDraft.ts  <- 整理草稿的纯函数

总计 952 行 Rust + 2208 行 TypeScript/TSX。Rust 后端负责所有跟文件系统、git 打交道的事(文章管理、页面管理、frontmatter 处理、图片处理、配置持久化、发布时的 git add → commit → push),前端只管 UI 状态和编辑器,所有文件 IO 走 IPC。

现在的工作流 ​

写这篇文章本身就是用它写的:

  1. 点「新建」,填标题、tag、category,后端按 slug 化的文件名建好 frontmatter 模板
  2. 编辑器里写正文,截图 Ctrl+V 粘进去,后端把图存到 docs/public/images/ 并自动插好路径
  3. 点「整理」,formatDraft.ts 自动补缺失的 frontmatter 字段、规范段落、调整图片占位
  4. 点「发布」,后端跑 git add → commit → push,发布日志实时滚到下方

7 步变成 4 个按钮。


算账:花的时间值不值 ​

老老实实数:博客代码量不大,但每一坑都得调一段时间,不是一两小时,是断断续续花掉好几个晚上。从 VitePress 起手到 Tauri 工具能正常发文,前前后后好几个月。实际花在博客内容本身的时间,远少于花在工具链上的时间。

如果按这样算结果
按"写一篇文章"的单价荒诞,前几篇的分摊成本高得不像话
按"能复用的能力"算能算得回来

真正的回报:

  • 学了一遍 CI/CD 全流程,下个项目能直接套
  • 学了 Rust,952 行不算精通,但摸到了门
  • 写作流畅度 = 文章产出量,想写和动手写之间的摩擦小到可以忽略
  • 整套东西完全可控,主题、组件、写作工具、部署,每一层我都改得动

这篇的局限 ​

  • "几个月""半年"是我的大致估算, 我没有精确记录工时。
  • 这条路不适合所有人。 如果你只想写文章,选个现成主题和一个现成编辑器,成本低得多。
  • "算得回来"取决于你是否真想学这些东西。 如果不想学 Rust 和 CI/CD,这就是纯粹的时间成本。
  • 代码行数和 commit 哈希是我写这篇时的状态, 后面会变。

一句话 ​

我不是为了写博客才折腾工具,我是借写博客这件事,把"自己想学的东西"全学了一遍。博客只是承载体,真正在产出的,是能复用到下一个项目的那套能力。


你呢?有没有"看起来在折腾但其实是在攒能力"的事? 评论区聊聊。

所属系列AI 与工具工作流第 4 / 4 篇
  1. 1AI Agent 不是玩具,是工具人
  2. 2没验证就汇报,是 AI 协作里最贵的坏习惯
  3. 3Claude / ChatGPT 海外订阅怎么省:我用苹果渠道把月费压到 ¥80
  4. 4一个个人博客,为什么最后被我做成了桌面写作工具

交流

评论区

评论需要 GitHub 登录;如果评论区没有加载出来,也可以直接发邮件给我。

邮件联系
评论区加载中…

基于 VitePress + Teek 搭建