从 Typecho 迁移到 blog-v3:把动态博客变成静态站

记录一次从 Typecho 迁移到 blog-v3,并部署到 Vercel 的过程。

以前写博客,是登录 Typecho 后台、维护 PHP 和 MySQL;迁移之后,是写 Markdown、提交 Git,再让 Vercel 自动把站点发布出去。

这篇记录不是一份“从零开始”的教程,而是一次迁移复盘:为什么从 Typecho 换到 blog-v3,迁移时处理了哪些内容,哪些地方容易踩坑,以及最后如何部署到 Vercel。

为什么迁移

Typecho 很轻,写作体验也稳定。它的问题不在“不能用”,而在维护成本会慢慢变成隐形负担:服务器环境、PHP 版本、数据库备份、主题兼容、插件更新、反垃圾评论、附件路径,这些东西都需要持续照看。

我后来更想要的是一种简单的发布链路:

  • 文章就是 Markdown 文件。
  • 历史版本交给 Git 管。
  • 构建和部署交给 Vercel。
  • 博客本身尽量不依赖数据库。
  • 换服务器、换域名、回滚文章都更直接。
静态博客不等于功能变少

迁移路线

备份 Typecho 数据库和附件

先保留完整数据库、usr/uploads 附件目录、主题目录和配置文件。

导出文章

从数据库中取出文章标题、正文、发布时间、分类、标签、slug 和永久链接。

转换 Markdown

把 Typecho 的 HTML 或 Markdown 内容整理成 blog-v3 能读取的 Markdown 文件。

整理图片与链接

统一图片目录,处理旧站内链、附件路径、相对路径和历史永久链接。

本地构建

在本地运行安装、开发和构建命令,确认文章、组件、RSS、站点地图都能正常生成。

推送 GitHub

把 blog-v3 项目推送到 GitHub,让 Vercel 接管部署流程。

部署到 Vercel

导入仓库,设置构建命令、环境变量和域名,等构建通过后再切换正式流量。

不要急着删除旧站

新站第一次上线后,旧 Typecho 至少保留一段时间。先确认文章 URL、图片、RSS、站点地图、搜索引擎收录和评论系统都没问题,再考虑关闭旧环境。

Typecho 和 blog-v3 的差异

Typecho 是动态博客系统,核心数据在 MySQL 里。它的优势是后台写作方便、生态成熟、部署在传统 PHP 主机上很直接。

但它也意味着每次访问都依赖运行时环境:Web 服务器、PHP、数据库、插件和主题都要保持可用。

备份旧站

迁移第一步不是导出,而是备份。即使后面转换脚本写错、图片路径处理错、文章格式乱掉,只要备份完整,就还能重来。

备份数据库和附件
backup.shsh
# 备份数据库
mysqldump -u typecho_user -p typecho_db > typecho-2026-05-04.sql

# 备份附件
tar -czf typecho-uploads-2026-05-04.tar.gz /path/to/typecho/usr/uploads

# 备份主题和配置
tar -czf typecho-site-2026-05-04.tar.gz /path/to/typecho/usr/themes /path/to/typecho/config.inc.php
备份时我会额外留意这些字段

文章正文、文章 slug、创建时间、更新时间、分类、标签、自定义字段、附件路径、评论数据和旧永久链接。尤其是永久链接,后面要不要做跳转,全靠这一步记录清楚。

导出文章

Typecho 的文章主要在 typecho_contents 表里,分类和标签关系通常在 typecho_relationshipstypecho_metas 里。我的处理方式是先导出结构化数据,再生成 Markdown 文件。

一个简化的导出思路
export-posts.sqlsql
SELECT
  cid,
  title,
  slug,
  text,
  created,
  modified,
  type,
  status
FROM typecho_contents
WHERE type = 'post'
  AND status = 'publish'
ORDER BY created ASC;

拿到数据后,再把每篇文章转换成类似这样的文件:

post-frontmatter.ymlyaml
---
title: 文章标题
description: 文章摘要
date: 2026-05-04
updated: 2026-05-04
type: tech
tags: [旧标签一, 旧标签二]
---

这里最耗时间的不是导出,而是清理正文。老文章里可能混着 HTML、短代码、相对图片、旧主题样式类名,以及一些只在 Typecho 插件里有效的写法。

内容清理

我把内容清理拆成三类。

  • 能自动替换的内容
    • 旧图片域名
    • /usr/uploads/ 路径
    • 常见 HTML 标签
    • 站内链接
  • 需要人工检查的内容
    • 复杂表格
    • 代码块语言
    • 旧短代码
    • 嵌入视频
  • 可以顺手重写的内容
    • 年久失效的外链
    • 不准确的描述
    • 已经过时的教程步骤

图片路径最容易拖慢迁移

如果旧文章大量使用相对路径,建议先统一成绝对路径或迁移到固定图床。静态博客部署到 Vercel 后,图片路径不会再经过 Typecho 的运行时逻辑兜底。

迁移时我保留了一个原则:文章正文尽量变成“普通 Markdown”。只有确实能增强阅读体验的地方,才使用 blog-v3 的 MDC 组件。

比如提示类内容可以改成:

alert-example.mdmd
::alert{type="info" title="迁移提示"}
如果旧站文章 URL 已经被搜索引擎收录,迁移后要么保持路径一致,要么配置 301 跳转。
::

配置 blog-v3

blog-v3 本身是 Nuxt 项目。迁移文章之后,重点检查站点信息、导航、评论、站点地图、RSS 和代码高亮配置。

示例配置片段
blog.config.tsts
export default {
  site: {
    name: '你的博客名',
    url: 'https://your-domain.example',
    description: '这里写博客描述'
  },
  author: {
    name: '你的名字',
    email: 'you@example.com'
  }
}

本地检查时,我习惯先跑一遍安装和构建。

local-check.shsh
pnpm i
pnpm init-project
pnpm generate

写文章时常用的快捷键还是那几个::key{code="Control" icon} + S 保存,:key{code="Control" icon} + K 搜索文件,构建失败就先看终端输出。

部署到 Vercel

Vercel 部署这一步比较直接:

  1. 把 blog-v3 项目推送到 GitHub。
  2. 在 Vercel 导入这个仓库。
  3. Framework Preset 选择 Nuxt。
  4. Build Command 使用项目默认构建命令。
  5. 确认 Node.js 版本和环境变量。
  6. 构建通过后绑定域名。
deploy-flow.shsh
git add .
git commit -m "migrate blog from typecho to blog-v3"
git push origin main

先部署预览站,再切正式域名

不要一开始就把旧域名解析到新站。先用 Vercel 的预览域名检查文章、图片、RSS、站点地图和移动端样式,确认没问题后再修改 DNS。

部署失败先看 Build Logs
Vercel 检查项
  • 构建命令是否正确。
  • Node.js 版本是否与本地一致。
  • 环境变量是否配置完整。
  • RSS 是否能访问。
  • sitemap.xml 是否能访问。
  • 文章详情页刷新是否正常。
  • 旧文章链接是否需要 301 跳转。
  • 图片是否存在跨域、404 或防盗链问题。

评论系统怎么处理

Typecho 的评论在数据库里,静态博客没有内置数据库,所以评论迁移要单独考虑。

我没有把评论迁移当成第一优先级。原因很简单:文章内容、链接和图片才是博客迁移的主体。评论可以后处理,甚至可以只保留旧站备份,不导入新系统。

可选方案大概有三种:

最简单。保留数据库备份,不在新站展示旧评论。适合评论不多,或者评论时效性较强的博客。

永久链接和 SEO

如果旧 Typecho 的 URL 已经被搜索引擎收录,迁移时要特别小心。最理想的情况是新站保持旧路径不变;如果做不到,就配置跳转。

不要让旧文章大面积 404

404 会影响访问体验,也会让搜索引擎重新评估页面。迁移后第一周要重点看访问日志、搜索控制台和 Vercel Analytics。

Vercel 可以通过 vercel.json 配置重定向。具体规则要看旧站路径,这里只放一个示例。

vercel.jsonjson
{
  "redirects": [
    {
      "source": "/archives/:slug",
      "destination": "/posts/:slug",
      "permanent": true
    }
  ]
}

我的迁移检查清单

我的迁移检查清单
  • Typecho 数据库已完整备份。
  • usr/uploads 附件目录已完整备份。
  • 文章标题、日期、slug、标签、分类已导出。
  • Markdown front matter 能被 blog-v3 正确解析。
  • 图片路径已统一处理。
  • 旧站内链已替换或配置跳转。
  • 本地 npm run build 通过。
  • Vercel Preview 部署通过。
  • RSS 和站点地图正常。
  • 正式域名切换前已检查主要文章。

迁移后的感受

Typecho 更像一个可靠的写作后台,blog-v3 更像一套把内容纳入版本管理的发布系统。

迁移之后,写作流程变得更“工程化”:新建 Markdown、写 front matter、提交 Git、等待 Vercel 构建。它不一定适合所有人,但很适合希望长期掌控内容、减少服务器维护、让博客更容易迁移和回滚的人。

最后留下一个经验:迁移博客不要追求一次性完美。先让文章、图片、链接和部署跑通,再慢慢处理评论、样式、历史短代码和旧文章修订。静态博客最大的好处,就是每一次调整都能被 Git 记录下来,也都能随时回退。

新故事即将发生
组件样式示例

评论区

评论加载中...