这个博客,我想了两年

说"想"其实不太准确,更像是一个执念。在早期我还不会写前后端,不会写嵌入式代码的时候就有了,当时还在玩电子,偶然间看到了 @ushio 的 B站视频 和 网站,窝觉得很好玩我也要。后来花了小半年时间,从零学会了写 C 和一点点 JS CSS 用 Hexo 搭了一个静态博客部署在 Github Pages,也算是有了自己的小天地。

Hexo: A fast, simple & powerful blog framework. , hexo.io, opens in new tab
Hexo 项目主页在深色模式下的截图,左上角是蓝色六边形 "H" 标志,旁边是 Docs、API、News、Plugins、Themes、About 导航链接、一个 GitHub 图标、一个带 Cmd-K 提示的搜索框,右侧是英文语言切换器。主视觉区写着 "A fast, simple & powerful blog framework",下方是可复制的安装命令 `$ npm install hexo-cli -g`,配有一个蓝色箭头按钮,再下面是一排徽章:41k GitHub stars、5k forks、每月 212k 次下载,以及一个 Follow @hexojs 链接。发布信息栏列出 hexo 8.1.0(2025-10-26)、hexo 8.0.0(2025-09-16)、hexo 7.3.0(2024-07-02)和 Hexo 7.2.0(2024-04-17),下一部分以 "Blazing Fast" 和 "Markdown Support" 两个功能标题开始。发布日期和下载量数据表明该截图拍摄于 2025 年 10 月下旬或之后。
ushio , sakura-ushio.icu, opens in new tab
一张个人博客文章列表的截图,左侧是深色侧边栏,其中有一个圆形的动漫风格头像、名字「小汐」、一个「主页」链接、一行「所有文章 / 友链 / 关于我」链接,以及四个圆形社交图标,包括 GitHub 和 QQ。主栏显示一张置顶的文章卡片,标题为 PD-METER-R4,日期为 2023-01-29,其中文摘要写道该项目正在开发中,与 R3 相比优化了布局、更换了主控,并新增了一些功能;下方是两张小型绿色 PCB 的照片,板上标注 USBC-R4 SAKURA,分别为正面和背面,拍摄于白布之上,带有小米 12S Ultra 的相机水印,显示 2023.02.06 15:47。该卡片带有「置顶」标签和一个「展开全文 >>」按钮,下方开始出现第二张卡片 WORX-BAT-Charger,日期为 2023-02-14。这似乎是一位硬件爱好者的博客记录其 USB-C 功率诱骗/测量板迭代过程的佐证。

再后来,看到了 @Innei 的小站,设计很精致、功能也很全,当时的我看了一眼我就想要,甚至还赞助支持了,虽然后面没用上但是这钱也花的不怨 因为我摸到了 React 源码,就和我最初看到 C 一样,不过就是代码嘛,有什么大不了的,总有一天我要自己写一个。

静かな森 , innei.in, opens in new tab
深色模式下某个人博客首页的截图,背景近乎纯黑,浅色花瓣飘落其间。顶部居中是一个胶囊形导航栏,中文条目为首页(当前选中)、文稿、手记、时光、思考和更多,左上角是一个小的二次元风格头像,右上角是一个登录图标;左侧的主视觉文字写着 "Hi, I'm Innei 👋。",其下方是 "A NodeJS Full Stack <Developer />" 以及 "An independent developer coding with love." 一行。再往下是一排圆形社交按钮——Bilibili、网易云音乐、GitHub、邮箱、RSS、Telegram 和 X——右侧则由一幅银发、系粉色蝴蝶结女孩的大幅圆形二次元肖像压住画面,底部边缘横排着一句关于责任与内心力量的灰色中文引言。这显然是 Innei 个人网站在桌面宽度浏览器中呈现的落地页视图。

那是 2024 年,然后 24, 25, 26年 到了现在

从那之后就停不下来了

失控

一开始只是想给 @colmugx Hexo 主题 Nlvi 加个深浅色切换,用 Dark Reader 的 JS 糊了一个,丑,不满意。然后学 CSS @media,再到 JS SPA 切换,TailwindCSS .dark class, 再到 SSR next-theme,最后手搓 Cookie + Head Sync Inline 脚本解决 FOUC 闪烁,我折腾了四五种方案。

🎨 A simple theme for hexo. , github.com, opens in new tab
一张 Hexo 博客主题的宣传效果图,左侧是大号浅灰字体的 wordmark "NIvi",下方压着一道短短的鲑鱼粉色下划线,右侧是两张相互重叠的浏览器样式主题截图。较大的那张桌面宽度面板顶部是米白色 header,内有手写体 logo "Hexo" 和一排导航:search、ARTICLE、ARCHIVES、TAGS、ABOUT,其下是一篇日期为 2013-12-27、标题为 "Elements" 的排版测试文章——也就是 Hexo 标准示例页面,依次走过 Heading 1 到 Heading 6、一段 lorem ipsum 的 Paragraph 小节(含粉色行内链接、bold、italic、underline 和 code span)、一段带粉色竖条的 blockquote,以及一张三列表格,表头为 "Table Header 1–3",行内容为 "Division 1–3"。同一页面的移动端或平板窄版渲染叠在其右下角,logo 居中,相同内容重排为单列。整体置于纯白背景上,读起来就是一份主题展示,用以证明该设计在两种宽度下都能干净地渲染出完整的 HTML 元素集。

但这只是冰山一角。看到 React 之后,我从石器时代的 Hexo 和 Vanilla JS 一路走到了 Next.js 13 Page Router,又拐去看 Vue、研究 SPA 路由、理解 index.html fallback,项目新建了无数次。买了服务器,折腾 Docker、Nginx、NAS,嫌 1Panel 丑手写了 Canopy 面板 研究 NAS 存储阵列写了 RFS,搞 SSL 被国内环境折磨的 acme.sh 抽风逼到用 Rust 写了个反向代理:Vane & Lazyacme,本来只是一个晚上三小时写出来的八百行垃圾,结果群友一怂恿,写了四个月,HTTP/3、Zero-Copy、Layer 模型、Flow 引擎全往里塞。后面还有 Seam,一个全栈框架,也是天坑,以后再说吧。

过度工程

然后 AI 时代来了,焦虑又翻了一倍

最讽刺的是,这些东西本来都应该是有了博客之后,边记录边做的。结果博客鸽了又鸽,想法越来越多,却没有一个地方能记录它们。一边是内心在谴责;说好了 Vane 要做完,就不能,停另一边是越做越远的无力感。我一直都记得我要做什么,但就是做不出来。仔细想想我其实已经很久都没有坐下来写过什么东西了,现在回头看,这一切都指向同一个东西——过度工程。

我当时其实并不不觉得自己在跑偏。Vane?反正博客以后也要部署,总得有个反向代理吧。Seam?反正迟早要写全栈,不如先把我理想中的框架搞好。每一步都有理由,每一步都是"以后用得上"。但问题是,"以后"永远不会来,因为我从未开始...

失败

做博客实际上不需要一个反向代理,不需要一个自研框架。而当时的我把它们当成了前置条件,作为了那个永远 Blocking 但是却合理的理由,但它们从来都不是。真正的前置条件只有一个:坐下来,把第一篇文章写出来。

其实博客不是没动过,恰恰相反,我做了三次

Vercel , vercel.com, opens in new tab
Next.js 首页在深色模式下的截图,展示桌面浏览器中的着陆页 hero 区域。顶部导航栏左侧是 Vercel 三角形标志和 NEXT.js 字标,旁边是 Showcase、Docs、Blog、Templates 和 Enterprise 链接,右侧是带 ⌘K 提示的 "Search documentation..." 搜索框、一个 Deploy 按钮和一个 Learn 按钮。页面中央以大号白色字体写着 "The React Framework for the Web",下方副标题为 "Used by some of the world's largest companies, Next.js enables you to create high-quality web applications with the power of React components,",再往下是一个浅色的 "Get Started" 按钮和一个深色的 "Learn Next.js" 按钮,其下是命令 `~ npx create-next-app@latest`。文字后方以淡淡的点状网格线和两条局部圆形轮廓作为背景装饰。

第一次还是 Next.js 13 Page Router 那会。那时候我蒙懂 SPA 是什么,SSR、SSG、ISR 这些概念一个都不清楚,但看别人说 SSR 好,那我也要用。结果写着写着发现自己根本不理解这些架构在解决什么问题,做不下去了。后来呢,转 Vue 2 纯 SPA,为什么选 Vue?说来惭愧,觉得名字好听,反正也新,试试呗。也没撑多久。第三次回到 React,从单 JSX 开始,学了 TypeScript,会了 TSX,理解了 CJS 和 ESM 的区别,爱上了 Reactive,用上了 Lucide、Framer Motion、Radix UI 这些日后离不开的库——这次终于像点样子了。但我还是失败了,因为本质上我只是在模仿,别人用什么我就拿来用,看起来像那么回事,实际上根本不理解为什么要这样做。再加上 AI 的幻觉加持,很多东西都能跑起来一个 MVP,但 Scale Up 的时候全是坑。

Remix , remix.run, opens in new tab
Remix 网站着陆页的截图,页面以浅灰到白的渐变为背景,左上角是 "Remix" 字标,右上角一行导航写着 Blog、Jam、Store、V2 Docs。居中的标题文字写着 "Remix 3 is under active development",下方副标题为 "A new full stack framework built on Web APIs"。画面下方三分之二被一幅风格化插图占据:一辆汽车藏在黑色罩布之下,褶皱处泛着光,一条彩虹条纹的对角横幅与白色赛车条纹般的光带从中间横穿而过——正是经典的"蒙布超跑"预告图式。它呈现出 Remix 3 项目页处于预告阶段的样子,框架的重写工作在任何版本发布之前就已开始对外宣传。

后来又学了 React(Remix) Router Loader、Next.js 15 App Router、RSC,但这时候日常已经很忙了,没什么时间写代码,倒也没机会第四次失败。现在想起来,我的网站从 Next.js 13 写到了 Next.js 15 ,前脚刚迁移完成,还没上线,Next.js 16 beta-1 就出了。

放手吧

说"想开了"其实不准确,是我累了。

一张 macOS 终端窗口的截图(左上角有红黄绿三个交通灯按钮、深色背景、等宽字体),显示一张用方框线绘制的表格,内容是每日 LLM token 用量与费用,页面已滚动,表头行不在可见范围内。每一行是 2026-03-03 至 2026-03-13 之间的一个日期,配上当天使用的模型——haiku-4-5、opus-4-6,部分日期还有 sonnet-4-6——后面跟着五个数字列,可读作 input、output、cache-write 和 cache-read tokens 以及一个总计,最后是一个美元金额;总计从 2026-03-12 的 161,186,904 tokens、97.92 美元,到 2026-03-09 的 3,277,442,496 tokens、1,765.56 美元。cache-read 是占比最大的一列,常常达到数十亿,而 output tokens 只有几百万,费用与该总计高度相关。这看起来是某个用量统计 CLI 的输出,反映出连续多日的高强度 Claude Code 工作负载,在 2026-03-06 至 2026-03-09 期间达到峰值,约每天 1,700 美元。

AI 时代的节奏太快了。模型一个接一个迭代,新技术一轮接一轮冒出来,我越来越焦虑,好像停下来就要被超越。最疯的时候一天写 16个 小时代码,Token 一天就能烧 $1.9k USD (大概2月的时候吧),人快废了。但让这一切停下来的不是什么顿悟,就是单纯的累了。在越来越紧的节奏下,最后一根稻草压下来,我反而释然了,想开了,摆烂了;这样,也挺好的。

我开始放手。放弃曾经执着的东西,学会点到为止,明天的事明天再说。Vane 没做完?先放着。Seam 还差很远?以后再来。博客不完美?先上线。开始完全 Vibe Coding,没问题就不管,有问题再说。

奇怪的是,放手之后质量并没有变差。我想这大概是因为之前那些"古法"编程的日子没有白费;早在 GPT-2 时代我就开始用 AI 了,但那时候我还在老老实实地写每一行代码、理解每一个概念。那段经历给了我底子,与其说后来 Vibe Coding 不如说是 Context Coding,该有的判断力还在,并没有因为放手就出什么低级错误或者说是事故。

是之前所有的折腾,给了我现在放手的资本

原点

最终的方案反而很简单:All in Cloudflare。R2 对象存储、D1 Edge 数据库、KV 做缓存、Worker 跑 SSR,全部 Serverless,没有服务器。

Cloudflare Worker , workers.cloudflare.com, opens in new tab
Cloudflare 营销主页 hero 区域的截图,裁切至页面顶部,背景是饱和的橙色,带有淡淡的点状纹理,底部中央升起一片暖色的浅淡光晕。导航栏包含 Products、Solutions、Resources 和 Pricing 这几个下拉项,右侧是一个 "Login" 胶囊按钮和一个白色的 "Start building" 按钮;标题写着 "Everything we learned from powering 20% of the Internet—yours by default",其后是副标题 "Cloudflare is your AI Cloud with compute, AI inference, and storage — letting you ship applications instead of managing infrastructure.",以及第二个白色的 "Start building" 行动号召按钮。这体现了 Cloudflare 当前把自己定位为 "AI Cloud",而非纯粹的 CDN 或安全厂商,并以承载互联网 20% 流量这一覆盖范围主张作为佐证。

这个答案讽刺吗?太讽刺了。因为在到达这个"简单"的终点之前,我走了一整圈弯路。曾经计划自建,所以要管服务器、折腾 Docker、管容器,于是写了 Canopy 做管理面板,写了 Lazycert 管证书,写了 Vane 做反向代理,写了 Twig 做资源监控埋点。一堆项目,就为了伺候一台垃圾服务器。

存储也是一样。我嫌对象存储贵,想用自己服务器的硬盘,于是写了 RFS 一种 vfs 为了原子去重合并单文件,甚至复活了 80-90年代 的注册表理念,最后还通过 FUSE 挂载起来了。结果呢,花了更多时间造了一个不那么好的轮子,服务器还空跑了一年,完全就是彻底的亏本生意。

Vercel , vercel.com, opens in new tab
一张桌面浏览器截图,展示 Vercel 的营销主页,背景为黑色并叠加着淡淡的网格。深色导航栏左侧是 Vercel 的三角形文字标志,中间为 Products、Resources、Solutions、Enterprise 和 Pricing 菜单项,右侧是 Ask AI、Log In 和 Sign Up 控件;主视觉标题写着 "Build and deploy on the AI Cloud.",其下方的副标题为 "Vercel provides the developer tools and cloud infrastructure to build, scale, and secure a faster, more personalized web."。下方是两个按钮——白色的主要按钮 "Start Deploying",带有三角形图标,以及描边样式的次要按钮 "Get a Demo"。再往下,一个巨大的线条三角形自网格中升起,背后由光晕照亮,光晕从左侧的蓝色经顶端的绿色渐变到右侧的红色,表明这是对该站点当前 AI Cloud 定位的一次近期截取。

最后绕了一大圈,还是回到了 Serverless,Vercel 的概念好,但我不喜欢 Next.js;而且 Vercel 的魔法太多了,还有就是那个中间件设计的提前编译跑 Edge 上,最后还是割裂,甚至出了几个 CVE,还不如要么全部源站一起。而 Cloudflare Worker 就很好,达到了另外一种极端,小于 10MB 的产物编译成 WASM,Edge 上能跑真正的业务逻辑,这才是我想要的。除了费钱以外没什么缺点——但说起来也不算缺点,毕竟省下的时间就是钱。

Less is more

这句话我听过无数遍,但花了两年才真正理解它的含义。

回归工程的本质:「Make it function, make it correct, then make it exceptional.」我终于走上了正轨,让它 functional 了。现在的博客简陋吗?简陋。不完整吗?确实不完整。但总比没有好。如果你连上线都没有,一直在做那个"也许需要"的东西,一直在追求看不见的完美,那最后什么都拿不出来。这不是妥协,这是一种工程上的取舍,反正我是想开了。所以我想开了。不再为一个细节执着,反而走出了门。手机相册里已经很久没有户外的照片了,随手拍了一下路边的——已经很久没出门了嘛 (

一张俯视拍摄的照片,画面中一道修剪整齐的常绿灌木矮篱斜穿而过,位于一道浅色花岗岩路缘石之后,左下角是一条灰色铺装和沥青路面。灌木丛整体茂密,但靠近路缘石处明显稀疏,露出光秃的木质枝干和一层褐色的落叶,叶片带着春季新生长的黄绿色泽;一株细长的树干从种植带中伸出,位于画面上缘,远处背景中是一片锈红色的花坛植物。光线明亮而具方向性,角度足够低,将一个画面外物体的长而柔和的影子投在铺装和路缘石上,暗示时间为傍晚时分。

回头看之前走的弯路,后悔吗?不后悔。有些事你不自己试试,也许永远想不明白。更何况在 AI 时代,想走我当年的老路已经基本没有机会了,太多工作流已经被改变。另外这个项目是 Taki,100% AI Coding,但这不意味着不能长期维护,不意味着没有人味。其实有没有 AI 不重要,再说了,我喜欢的也不是写代码本身,而是 Building 一个东西...