同步博客到 Vercel

为什么要同步到vercel?主要是vercel 其实有国内cdn,如果绑上自己的域名,可以在国内直接访问,github pages不太行。


1. GitHub 仓库同步

同步流程很简单:将代码 push 到 GitHub,Vercel 在检测到仓库更新后会自动拉取并触发部署。

提示

在 Vercel 控制台使用 “Import Git Repository” 并授权 GitHub,可以快速完成仓库关联与初始部署配置。

2. Vercel 编译流程

Vercel 的构建与部署由两个关键文件驱动:项目配置 vercel.json 和构建脚本 vercel-build.sh

文件作用
vercel.json项目配置(构建命令、输出目录、缓存策略)
vercel-build.sh构建脚本(下载编译器、执行构建)

2.1 vercel.json 配置

代码 1 vercel.json 核心配置

{
  "buildCommand": "bash vercel-build.sh",
  "outputDirectory": "_site",
  "headers": [
    {
      "source": "/(.*)",
      "headers": [
        { "key": "Cache-Control", "value": "public, max-age=0, must-revalidate" }
      ]
    },
    {
      "source": "/assets/(.*\\.(?:woff2|woff|ttf|otf|eot))",
      "headers": [
        { "key": "Cache-Control", "value": "public, max-age=2592000, immutable" }
      ]
    }
  ]
}

关键配置说明:

vercel-build.sh(构建脚本)

代码 2 vercel-build.sh 构建脚本

#!/bin/bash
# 安装 typst 编译器到项目目录
curl -fsSL https://github.com/typst/typst/releases/download/v0.14.2/typst-x86_64-unknown-linux-musl.tar.xz | tar -xJ
mv typst-x86_64-unknown-linux-musl/typst ./typst
rm -rf typst-x86_64-unknown-linux-musl
chmod +x typst

# 执行构建(项目使用 uv 脚本管理)
uv run build.py build

构建脚本流程概览:

  1. 下载并解压 Typst 二进制到项目目录,设置可执行权限。
  2. 使用 uv run build.py build 调用项目的构建脚本完成站点生成。

2.2 build.py 构建脚本

build.py 是站点构建的核心,负责:解析依赖、增量编译、处理资源并输出 _site

代码 3 build.py 核心配置

#!/usr/bin/env -S uv run
# /// script
# requires-python = ">=3.10"
# dependencies = [
#     "pillow>=10.0.0",
# ]
# ///

CONTENT_DIR = Path("content")  # 源文件目录
SITE_DIR = Path("_site")       # 输出目录
ASSETS_DIR = Path("assets")    # 静态资源目录
CONFIG_FILE = Path("config.typ") # 全局配置文件
增量编译机制

build.py 实现增量编译以加速构建:

  1. 解析 #import / #include 追踪文件依赖关系。
  2. 比较源文件与目标文件的修改时间,仅在必要时重新编译。
  3. 监测全局配置(如 config.typ)或同目录资源(图片、.bib.md)的变化。

以下任一条件会触发重新编译:目标文件不存在、源文件或任一依赖文件较新、或资源文件发生变化。

构建产物结构(示意)
content/                    源文件目录
├── Blog/
│   └── index.typ          博客首页
├── Docs/
│   └── 同步vercel/
│       └── index.typ      本页面
└── ...

    ↓ typst compile

_site/                      输出目录
├── Blog/
│   └── index.html         生成的 HTML
├── Docs/
│   └── 同步vercel/
│       └── index.html     生成的 HTML
├── assets/                静态资源
└── ...

完整部署流程(示意)

代码 4 完整部署流程

┌─────────────────┐
│   本地编写内容   │
│  (.typ 文件)    │
└────────┬────────┘
         │ git push
         ▼
┌─────────────────┐
│   GitHub 仓库   │
└────────┬────────┘
         │ Webhook 触发
         ▼
┌─────────────────┐
│    Vercel       │
│  ┌───────────┐  │
│  │ 拉取代码  │  │
│  └─────┬─────┘  │
│        ▼        │
│  ┌───────────┐  │
│  │ 下载 typst│  │
│  └─────┬─────┘  │
│        ▼        │
│  ┌───────────┐  │
│  │ 执行构建  │  │
│  │ build.py  │  │
│  └─────┬─────┘  │
│        ▼        │
│  ┌───────────┐  │
│  │ 部署 _site│  │
│  └───────────┘  │
└─────────────────┘
         │
         ▼
┌─────────────────┐
│   用户访问      │
│ your-domain.com │
└─────────────────┘

本页最后更新:2025-12-23