所有项目
CONTENT AS CODE2026

XWSX 个人站

内容用 Markdown 写、页面用 React 服务端组件渲染、进程用 systemd 托管在一台服务器上。

开发实践自托管个人项目

这个站是什么

一个记录产品、代码与设计的个人站点。四个内容区各有各的模型:

  • 文章content/articles/*.md,文件名即 URL。标签自动聚合成标签云,同 series 的文章互相导航,正文里链接到其他文章会反向生成「链接到本文」
  • 项目content/projects/*.md。只写 frontmatter 就是首页的一张卡片,补上正文就自动生成案例页(## 分区会按 CSS 计数器自动编号)
  • 书架content/books/*.md,按在读 / 读完 / 想读分组
  • /now:一页当下状态

内容管线的几个决定

内容在构建期import.meta.glob 读进产物里,跑起来的进程不碰文件系统。这让部署退化成了「拷贝一份目录」,也让 RSS、搜索索引、sitemap 能和页面共用同一份解析结果——它们读的是同一个数组,所以 draft: true 一开,四处的表现自动一致。

Markdown 渲染和代码高亮都在服务端完成,输出纯 HTML。代码块的复制按钮是客户端组件在浏览器里找到已有的 <pre> 再做包装,属于渐进增强:脚本没加载出来时,代码本身照常可读。

设计上的取舍

视觉基调是纸墨编辑风:衬线中文标题、极淡的纸张噪点、坐标纸式的细网格。深色主题是另一套调过的色值,而不是把浅色反相——正文色、卡片底色、代码高亮的 token 色都各有一组值。

站点的吉祥物是一只「空气小狗」:按时辰切换待机 / 思考 / 开心 / 休息四种姿态,在文章页 40 秒无交互会打盹,读到底会出来庆祝。它同时出现在 404 页和错误页,有自己的一句台词。

数字

Lighthouse(模拟 Fast 4G,移动端口径)无障碍、最佳实践、SEO 三项是 100,性能 66 / LCP 5.5s。性能的瓶颈写在「还没还的债」里——主要是框架 JS 和一套没有按设计工作的字体分片。

还没还的债

框架 JS 535KB 是所选框架的固有成本,等上游稳定版;字体分片目前首屏加载 383KB,原因是切片的 unicode-range 互相重叠导致关键片从未生效,排查过程单独写了一篇;测试方面目前是空的,内容解析和聚合都是纯函数,补起来成本很低。

相关文章

各部分的细节写在几篇文章里:用 Markdown 和 RSC 搭一个站,然后把它跑在一台服务器上 讲架构与部署;我把中文字体切成 21 片,首屏还是下了 383KB 是一次失败的优化及其测量;中文标题不该套用拉丁文字的负字距 讲排版取舍;Node 说「操作成功完成」,却一个文件都没删 记录了一次构建中断的排查。

07 / 交付物
Markdown 内容管线与聚合层中文字体分片工具链一键部署脚本(含健康检查与回滚)明暗双主题与无障碍基线
回到项目
ESC