用 Notion 写作,Astro 渲染,Cloudflare 托管
这是这个博客的第一篇文章,同时也是一次部署验证。
为什么这么折腾
我想要的写作体验很简单:打开 Notion,写完,关掉。 不想碰 Markdown 文件,不想 git commit,不想在本地跑 dev server。
但我也不想要 Notion 自带的发布页 —— 排版不能改,域名不好看,加载也一般。
所以拆成了三层:
| 层 | 用什么 | 负责 |
|---|---|---|
| 内容 | Notion 数据库 | 写作、草稿、标签管理 |
| 构建 | Astro | 构建时拉取 API,渲染成纯静态 HTML |
| 托管 | Cloudflare Pages | 全球边缘分发,免费额度够用 |
数据是怎么流动的
Notion 数据库
↓ 构建时调用 API(notion.dataSources.query)
Astro 拿到「已发布」的文章列表
↓ notion-to-md 把 block 转成 Markdown
↓ marked 渲染成 HTML
dist/ 目录里的一堆静态文件
↓ 上传
Cloudflare 边缘节点
关键点是 API 只在构建时调用一次。访客打开网页时读的是纯 HTML,不走 Notion,所以速度和 Notion 的响应快慢无关。
几个踩过的坑
图片链接会过期
直接上传到 Notion 的图片,API 返回的 URL 大约一小时后失效。构建时下载下来的话没问题,但如果只是引用链接,第二天图片就全挂了。
解决办法:图片用外部链接(图床、S3),或者在构建流程里下载到本地。
状态字段决定可见性
只有 状态 = 已发布 的条目会出现在网站上。写到一半的东西留在 草稿 或 写作中,对外完全不可见 —— 这就是我要的:草稿箱和发布系统是同一个界面。
静态站不会自己更新
改完 Notion,网站不会自动变。需要触发一次重新构建(Deploy Hook 或者推一次代码)。
现在的工作流
- 在 Notion 数据库里新建一行,状态设成
写作中 - 点进去写
- 写完把状态改成
已发布 - 触发构建,两分钟后线上可见
就这样。
这篇文章本身就是通过上面这套流程发出来的。