重構博客底層
超好笑,每次寫文章都是在重構博客
沒有心力寫文章,但是有心力重構(
上年 又一次重開博客 講的就是重開了三次博客
從 Jekyll (2020) -> GitHub repository (2023) -> 最後選用 Docusaurus (2024)
這次架構和速度都有不少改動,從 2 分鐘變成 1 分鐘內,記錄一下
重構原因
- GitHub Actions 失敗
- 項目架構過於抽象 / 複雜,完全容器化
- 改用 pnpm,各種增加建構速度的方法
1. GitHub Actions 失敗
當時(2024 年 7 月)Docusaurus 版本是 3.4.0,每次見他有新版本時都會升級,一直升級到 3.7.0
最近(2025 年 7 月)升 3.8.0 版本,GitHub Actions 失敗了
[cause]: [Error: EBUSY: resource busy or locked, rmdir '/workspace/docusaurus-plus/build'] {
errno: -16,
code: 'EBUSY',
syscall: 'rmdir',
path: '/workspace/docusaurus-plus/build'
}
本機環境上沒有這個問題,因此嚴重懷疑是 GitHub Actions 中使用 Docker 的問題
也就是重構的第二個原因 —— 過於抽象,完全容器化
2. 項目架構過於抽象 / 複雜,完全容器化
抱著所有東西都 Reproducible(可重現) 的心態,將博客完全容器化
Containerfile.develop 記錄項目從零開始建立的方式,利用 volume mount,將需要的東西掛載到容器中,用 VSCode > Dev Containers: Attach to Running Container
進行開發
有點繁複,優點是所有東西都可重現
缺點是每次要啟動容器,需要先開一個像是 Docker 的 High-level Container Runtime,有底層東西改了需要 rebuild image,不能打開項目就直接 npm install
, npm start
而且 GitHub Actions 中也要用 Docker build image,再在裏面執行 build,速度緩慢,大約花費 2 分鐘
即使在 deploy.yml 添加 actions/cache@v4
來緩存 image 亦無補於事(很神奇,竟然沒有變快也沒有變慢)
所以不如改用常規的項目方式,本地 create project, push GitHub repository
3. 改用 pnpm,各種增加建構速度的方法
pnpm
experimental_faster
flag 加快建構速度- GitHub Actions 緩存
pnpm
pnpm create docusaurus
experimental_faster
Docusaurus 3.8.0 提到可以用
const config = {
future: {
experimental_faster: true,
},
};
去啟用這些改進,主要改用 SWC 和 Rspack 加速構建,使用感覺的確快了很多
GitHub Actions 緩存
根據 pnpm/action-setup, 緩存 pnpm
uses: actions/setup-node@v4
with:
node-version: 24
cache: "pnpm"
cache-dependency-path: docusaurus-plus/pnpm-lock.yaml
緩存 .docusaurus
和 node_modules/.cache
目錄
uses: actions/cache@v4
with:
path: |
./docusaurus-plus/.docusaurus
./docusaurus-plus/node_modules/.cache
key: docusaurus-${{ runner.os }}-${{ hashFiles('docusaurus-plus/docusaurus.config.ts', 'docusaurus-plus/sidebars.ts') }}
restore-keys: |
docusaurus-${{ runner.os }}-
最後
從 push 到 build 到 deploy GitHub Page 速度在大約 50 秒
主要的 build 只用了大約 10 秒
之前用 Container 的做法大約要 90 秒,快了 9 倍
其餘都是很難再壓縮的 actions/setup-node@v4
(10 秒), deploy (不穩定,7 - 30秒)
可以看 Action Page 所記錄的時間