博客搭起来了
1 分钟 随笔
这是第一篇文章。它同时也是这个站点的一条测试用例 —— 中文标题、多级标题、代码块、引用和列表,该有的都有。
静态站
核心诉求其实很简单:写得顺手,打开够快。
动态博客(WordPress 那一类)能做的事更多,但代价是需要长期维护一个数据库和一个运行时。对个人博客来说,这笔账通常不划算:真正会被访问的只有渲染好的 HTML,而渲染这件事完全可以在我自己的电脑上做完。
静态站的好处是这一条:服务器上只需要一个 Nginx,没有 Node、没有数据库、没有需要定期打补丁的运行时。服务器被攻击的面也小得多。
关于中文排版
中文和英文的排版需求相当不同,这一点在动手写样式时很快就体现出来了:
- 中文没有词间空格,所以行高需要更大才能不显得拥挤,1.75 到 1.8 比较舒服
- 英文按词断行,中文按字断行,所以行宽不能照搬英文博客常见的 65ch
- 中英混排时,数字和英文单词两侧需要一点空隙,否则会「粘」在汉字上
最后一条尤其容易被忽略。如果 HTML 压缩器把内联元素之间的空白删掉,阅读 5 分钟 和 · 就会连成一坨 —— 这恰好是 Astro 7 的一个默认行为变化,我在构建配置里把它关掉了。
坑
Astro 7 把 compressHTML 的默认值从 true 改成了 'jsx'。听起来只是压缩策略的调整,但对中文站点影响直接:
// 在 Astro v7 之前,这行会渲染成 "hello world"
// 在 Astro v7 里,'jsx' 模式会吞掉空白,变成 "helloworld"
export default defineConfig({
compressHTML: true, // 显式设回,恢复无损压缩
});
这类「默认值悄悄变了」的改动是最难排查的一类问题:代码没动、逻辑没错,只是输出少了一个空格。
接下来
后面会陆续写一些技术笔记。这个站点的全部内容都在 Markdown 里,加一篇新文章就是新建一个文件,然后跑一条部署命令。
- 写作时只管写 Markdown,不用碰模板
- 构建时 schema 会校验 frontmatter,写错日期会立刻报错
- 部署是原子的:新版本要么完整上线,要么完全不上线,不存在中间状态