这是一篇演示文章,用来展示博客的排版与功能。你可以在后台编辑、替换或删除它。
这个博客的第一条原则是:在自己的电脑上就能完整运行。写文章、改设置、上传图片、备份数据,都不应该依赖某个需要注册的在线服务。
技术选型#
| 关注点 | 选择 | 理由 |
|---|---|---|
| 框架 | Next.js(App Router) | 前台与后台在同一个项目里,服务端渲染对 SEO 友好 |
| 语言 | TypeScript | 数据结构在编译期就能对上 |
| 样式 | Tailwind CSS + 少量手写 CSS | 设计令牌集中管理,深浅色切换简单 |
| 数据 | Node 内置的 SQLite | 无需安装数据库,也无需编译原生模块 |
| 搜索 | SQLite FTS5 三元组索引 | 中文无需分词也能检索 |
数据层与页面分离#
所有 SQL 都收拢在 lib/repo 目录,页面只调用类似 listPosts()、getPostBySlug() 这样的函数:
// app/posts/[slug]/page.tsx
const post = getPostBySlug(slug);
if (!post) notFound();
const { html, toc } = await renderMarkdown(post.content);
将来如果要部署到不提供持久磁盘的平台,只需要把这一层换成托管数据库的实现,页面代码不用动。
迁移只追加,不修改#
数据库结构通过版本化的迁移脚本维护。每次升级前,程序会先自动给现有数据库拍一个快照:
VACUUM INTO 'data/backups/auto-before-migrate-v1.sqlite';
这样即使升级出了问题,文章也能原样找回来。
一些取舍#
- 不做可视化页面搭建器。常用设置集中在后台的「站点设置」里,够用就好。
- Markdown 中的原始 HTML 不渲染。写作时少了一点自由,换来的是不必担心粘贴进来的内容带有脚本。
- 动效克制。首页有一次完整的入场,其余地方只在你操作时给出反馈。
下一篇会写中文全文搜索是怎么做的。