2 分钟阅读 项目实战

从零搭建一个全栈博客,我踩了哪些坑

用 Astro + Supabase + Vercel 搭了一个自己的博客,折腾了两周,记录一下实际的技术选型和踩坑。

Astro Supabase Vercel 博客搭建
分享

起因

之前一直用现成的博客系统,但总觉得哪里不对劲。想加个功能要翻半天文档,样式改来改去也就那几种。

后来想,不如自己搭一个。要求不高:能写文章、能管理、长得不丑就行。

技术选型纠结了一阵。Next.js 功能多但重,Hexo 只能生成静态页面,最后选了 Astro。原因很简单:默认生成静态页面,需要交互的组件直接丢 React 进去,不用全站跑在一个框架上。 部署用的 Vercel,git push 就自动上线。

实际用了什么

Astro 4.16 + React 18 + Tailwind CSS 3.4
Supabase(PostgreSQL 数据库)
Vercel Serverless(部署)

Supabase 主要是省事。之前试过自己搭 PostgreSQL,光是配连接池和 SSL 就折腾了半天。Supabase 帮你搞定了这些,还送个管理面板,够用了。

踩过的坑

1. 从内容集合迁移到数据库

一开始用 Astro 自带的内容集合,markdown 文件放在 src/content/posts/ 目录下,构建时自动生成页面。但这样做有个问题:每次改文章都得改文件,然后重新部署。

后来决定把所有内容迁到 Supabase。写了个 getPosts() 函数,所有页面统一从数据库查数据。原来的 11 个文件全部改了一遍,删掉了旧的 content collection 配置。

2. Markdown 渲染

Astro 的内容集合自带 markdown 转 HTML。迁移到 Supabase 后,正文存的是原始 markdown,渲染得自己搞。

一开始想在客户端用 marked 库,但发现 Astro 的 define:vars 和 ES module 的 import 冲突,脚本直接报错。最后改在服务端用 marked.parse() 转好,再用 set:html 输出,简单粗暴但管用。

3. 管理面板

第一版用 localStorage 存数据,只能本地用,换个浏览器就没了。

第二版想直接在 Supabase 控制台改,太丑了受不了。

第三版就是现在这个,7 个 Tab:数据看板、文章管理、项目管理、名言管理、站点设置、插件管理、主题外观。文章支持新建、编辑、删除,所有内容实时同步到 Supabase。

4. 四套主题

搞了四个主题:Light、Dark(极客绿)、Deep Blue(深夜蓝)、Eye Green(护眼绿)。用户切换后存 localStorage,下次访问自动加载。

SSR 渲染的时候拿不到 localStorage,页面会闪一下。解决方案是在 <head> 里加一段内联 JS,优先读 localStorage 设置 class,避免 FOUC。

博客实际有哪些功能

搭完之后数了一下,功能还挺多的:

  • 首页:Hero 动画 + 打字机效果 + 最新文章列表
  • 文章:分类筛选、标签过滤、分页、无限滚动
  • 单篇文章:Markdown 渲染、LaTeX 公式、Mermaid 图表、代码高亮(Shiki github-dark 主题)、阅读进度条、目录导航
  • 评论:Giscus(GitHub Discussions)
  • 搜索:实时搜索,不用等
  • 音乐:本地 MP3 + 网易云音乐双模式
  • 项目展示:从 Supabase 读取
  • 归档:时间轴视图
  • 友链:链接管理
  • 联系:表单提交到 Supabase
  • 关于:3D 头像 + 随机名言 + 发文日历
  • 分享:社交媒体分享按钮
  • SEO:RSS 订阅、sitemap、Open Graph 标签
  • 管理面板:/admin,全功能 CMS

部署

部署在 Vercel 上,SSR 模式。git push 到 main 分支就自动构建部署。

有个小坑:本地 Node.js 是 22,但 Vercel Serverless Functions 要求 Node.js 18,构建时会出一个警告,但不影响运行。

写在最后

搭博客这个过程,比想象中花的时间多。但好处是每个环节都过了一遍:数据库设计、API 设计、前端渲染、部署优化、SEO、安全。

比如 Supabase 的 service_role key,只能在服务端用,绝不能暴露给前端。比如 Vercel 的 Serverless Functions 是按需启动的,第一次访问会慢一点(冷启动)。

这些细节,看教程学不到,只有自己踩一遍才知道。


代码开源在 GitHub,欢迎交流。

评论

加载中...

0/2000

你已到达宇宙的尽头

感谢你一路看到这里