我大一,在广西读书。这个博客是我做的第一个"正经"网站——所谓正经,意思是有真实用途、得一直活下去的网站,而不是写完就扔的作业。
为什么不用现成的
博客平台多得是,Notion 免费,WordPress 也行。我纠结过一阵,最后拒绝它们的理由其实很小:我想改页脚,想加一个自己的签名,想在背景里放几团慢慢飘的光斑。这些事在平台上要么做不到,要么要开会员。
还有一个不太光鲜的原因:我想知道博客到底是怎么跑起来的。用平台写十年,我也不知道"发布"按钮背后发生了什么。
从 fork 开始
起点是 tailwind-nextjs-starter-blog 这个模板。fork 下来的第一周我基本没写文章,全在删东西——删示例文章、删 snippets、删 projects 数据,把 site-metadata.ts 里的名字换成我的。删完之后站点突然就"是我的"了,这种感觉挺奇妙:原来把别人的东西清空,和自己从零写,工作量差不了太多。
技术栈没什么可炫耀的:Next.js 15 + Tailwind CSS,部署在 GitHub Pages。选它纯粹因为免费,而且源码在自己仓库里,哪天想搬家随时能搬。
静态导出的几个小坎
GitHub Pages 只能托管静态文件,而 Next.js 平时是跑在 Node 服务器上的。模板留了环境变量开关,构建时把整个站点导出成一堆 HTML。听起来顺滑,实际有几个坑:
API 路由在静态导出下不被支持。我的解决办法不太体面但有效——CI 里先 mv app/api api.disabled 把它们藏起来再构建,页面上用到这些接口的地方都写了兜底,拿不到数据就显示占位符。
next/image 的图片优化也用不了,因为那需要服务端跑优化器,只能 UNOPTIMIZED=true 关掉。空的文章列表、空的标签页还得准备占位路由,不然导出器会抱怨参数缺失。
这些事单个都不难,难在它们不会一次性告诉你。构建报错、修、再报错、再修,如此往复两三天,out/ 目录终于完整地躺在那里。
部署就是一次 git push
CI 是一个很普通的 GitHub Actions workflow:装依赖,跑构建,把 out/ 传给 Pages。之后我写文章的流程变成了:markdown 文件扔进 data/blog/,git push,一分钟后刷新页面就能看到。
deploy.yml 长这样(点开看)
name: Deploy static content to Pages
on:
push:
branches: ['main']
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
with: { version: 11 }
- uses: actions/setup-node@v4
with: { node-version: 22, cache: pnpm }
- run: mv app/api api.disabled
- run: pnpm install
- run: pnpm build
env:
EXPORT: 'true'
BASE_PATH: ''
UNOPTIMIZED: 'true'
- uses: actions/upload-pages-artifact@v3
with: { path: ./out }那些没什么用但让我高兴的部分
背景是三团模糊的光斑在 30 秒里慢慢漂移,灵感来自一个朋友的博客。页脚放了我的手写签名,斜体细字。个人卡片原本是横着的一大块,后来被我改成了竖着的小卡片——原来的尺寸会把 About 页的正文挡住,改完顺手把全站的横向滚动条也治好了。
还有友链。XFffff 的博客挂在我的页脚旁边,做博客这件事大概就是这样,一个人写,但不是一个人玩。
接下来
文章会慢慢写。最近做的两个项目——一个在线游戏厅和一个学习网站——的制作过程已经整理成文章放在站上了。如果你也想搭自己的博客,我的建议就一句:找个静态模板 push 上去,遇到什么修什么,两三天后它就是你的了。
