Skip to content
CloudZun
Go back

CloudZun.com 网站重构实录:从 Hugo 到 Astro Paper 的完整迁移

编辑此文章

CloudZun.com 网站重构实录:从 Hugo 到 Astro Paper 的完整迁移

摘要: 2026 年 3 月 21 日,我用 3 小时完成了 CloudZun.com 的完整重构——从 Hugo + FixIt 主题迁移到 Astro Paper,迁移 115 篇博客文章,优化首页和 About 页面。这篇文章记录了完整的技术决策、实施过程和踩坑经验。


📖 项目背景

为什么重构?

我的旧博客 blog.huaqloud.com 使用 Hugo + FixIt 主题,虽然功能完整,但存在几个问题:

  1. 主题过于重量级 - FixIt 功能丰富但配置复杂
  2. 静态生成速度慢 - 115 篇文章构建需要 30+ 秒
  3. 自定义困难 - 想修改布局需要深入 Hugo 模板系统
  4. 技术栈不统一 - 想用更现代的 React/组件化开发方式

新目标


🎯 技术选型

候选方案对比

方案优点缺点评分
Hugo + FixIt成熟稳定、功能丰富模板复杂、构建慢⭐⭐⭐
Next.js + Vercel灵活强大、生态好需要服务器渲染、配置复杂⭐⭐⭐⭐
Astro Paper轻量快速、组件化、SEO 好生态相对较小⭐⭐⭐⭐⭐

为什么选 Astro Paper?

  1. 性能优秀 - 静态生成,零 JavaScript 运行时
  2. 组件化 - 使用熟悉的 React/JSX 语法
  3. SEO 友好 - 自动生成 sitemap、RSS、结构化数据
  4. 简洁优雅 - 代码易读,易于自定义
  5. Markdown 支持好 - 原生支持 MDX、Frontmatter

🚀 实施过程

Phase 1: 初始化项目 (30 分钟)

# 克隆 Astro Paper 模板
git clone https://github.com/satnaing/astro-paper.git cloudzun.github.io
cd cloudzun.github.io
npm install

# 配置站点信息
# 编辑 src/config.ts
SITE: {
  website: "https://www.cloudzun.com/",
  author: "CloudZun",
  title: "CloudZun - AI 协同编程讲师、工程师、技术博主"
}

Phase 2: 配置自定义域名 (10 分钟)

# 创建 CNAME 文件
echo "www.cloudzun.com" > public/CNAME

# GitHub Pages 配置
# Settings → Pages → Custom domain → www.cloudzun.com

# DNS 配置(Cloudflare)
# CNAME cloudzun.github.io

Phase 3: 内容迁移(最复杂,2 小时)

3.1 博客文章迁移

源数据: https://github.com/cloudzun/clean-vercel-blog (115 篇 Markdown 文章)

目标格式: Astro Paper Frontmatter

# Hugo 格式(源)
---
title: "文章标题"
date: 2026-02-04T20:01:00+08:00
draft: false
tags: ["tag1", "tag2"]
categories: ["分类"]
---

# 正文

# Astro Paper 格式(目标)
---
title: '文章标题'
featured: true
pubDatetime: 2026-02-04T12:01:00Z
tags: ['tag1', 'tag2']
description: '文章描述'
---

# 正文

转换规则:

字段HugoAstro Paper转换逻辑
标题title: "xxx"title: 'xxx'双引号→单引号
日期date: ...+08:00pubDatetime: ...ZUTC 转换(-8 小时)
标签tags: ["a", "b"]tags: ['a', 'b']双引号→单引号
分类categories: [...]删除Astro Paper 不支持
草稿draft: false删除默认为 false
描述description: 'xxx'从正文提取

遇到的问题:

  1. 多行 tags 格式 - 有些文章 tags 是多行 YAML 列表
  2. 特殊字符 - title 中包含单引号(如 '技术外骨骼'
  3. 日期格式不统一 - 有些只有日期,有些带时区
  4. 缺少 description - 需要从正文自动提取

解决方案: 编写 Python 脚本批量处理

#!/usr/bin/env python3
"""博客文章 frontmatter 修复脚本"""

import re
from pathlib import Path
from datetime import datetime, timedelta

def convert_date(date_str):
    """转换日期为 UTC 格式"""
    match = re.match(r'(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})\+08:00', date_str)
    if match:
        dt = datetime.strptime(match.group(1), '%Y-%m-%dT%H:%M:%S')
        dt_utc = dt - timedelta(hours=8)
        return dt_utc.strftime('%Y-%m-%dT%H:%M:%SZ')
    # ... 更多转换逻辑

def fix_frontmatter(filepath):
    """修复单篇文章"""
    # 解析 frontmatter
    # 转换字段
    # 添加 description
    # 写入新文件

执行结果:

🚀 博客文章 frontmatter 修复脚本
============================================================
找到 113 篇文章
  ✓ 2026-03-11-openclaw-windows-install-final.md
  ✓ 2026-02-12-searxng-complete-user-manual.md
  ✓ 2026-03-14-hn-daily-digest.md
  ...

✅ 完成!成功:113, 失败:0

3.2 首页和 About 页面设计

首页设计原则:

最终效果:

<!-- src/pages/index.astro -->
<h1>你好,我是 CloudZun</h1>
<p>讲师 🎓 · 工程师 💻 · 博主 📝</p>

<!-- 研究方向 -->
<ul>
  <li>AI 协同编程教育体系</li>
  <li>Vibe Coding 方法论</li>
  <li>企业办公自动化培训</li>
  <li>Agentic AI 工作流实践</li>
</ul>

<!-- 社交链接 -->
<div class="social-links">
  <a href="https://github.com/cloudzun">GitHub</a>
  <a href="https://linkedin.com/in/cloudzun">LinkedIn</a>
  <a href="https://t.me/cloudzun">Telegram</a>
  <a href="mailto:info@cloudzun.com">Email</a>
</div>

About 页面内容:

Phase 4: 构建和部署 (20 分钟)

# 本地构建测试
npm run build

# 输出:
 Astro v5.16.6
 building client + server bundles...
 build complete in 3.42s
 generating static pages...
 Generated Page   / (115 pages indexed)
 generating search indexes...
 Indexed 113 pages

# 提交推送
git add -A
git commit -m "feat: 迁移 115 篇博客文章"
git push origin master

# GitHub Actions 自动部署
# 等待 2-3 分钟
# https://www.cloudzun.com/ 上线!

🐛 踩坑记录

坑 1: Frontmatter 格式混乱

问题: 从源仓库复制的文章 frontmatter 格式不统一

表现:

# 问题 1: 多行 tags
tags:
  - openclaw
  - ai
  - embedding

# 问题 2: 日期格式不一致
date: 2026-02-04T20:01:00+08:00
date: 2026-03-03
date: "2026-03-12"

# 问题 3: 特殊字符
title: '当 AI 成为你的'技术外骨骼''  # 单引号冲突

解决: Python 脚本统一处理,特殊情况手动修复

坑 2: Astro 构建失败

问题: npm run build 报错

[InvalidContentEntryDataError] blog → xxx data does not match 
collection schema. pubDatetime: Required

原因: Frontmatter 缺少必填字段 pubDatetime

解决: 确保所有文章都有 pubDatetimedescription

坑 3: OpenCode 子代理权限问题

问题: 尝试用 OpenCode 自动修复 frontmatter,但被 ACPX 权限系统阻止

错误信息:

Permission denied by ACP runtime (acpx). 
ACPX blocked a write/exec permission request in a non-interactive session.

原因: sandbox: inherit 参数未正确传递给 ACPX 运行时

解决: 放弃 OpenCode,自己写 Python 脚本完成

教训:

坑 4: 部署后页面 404

问题: 推送后访问 https://www.cloudzun.com/ 显示 404

原因: GitHub Pages 部署需要 2-3 分钟

解决: 等待 + 检查 GitHub Actions 日志


📊 最终成果

性能对比

指标Hugo + FixItAstro Paper提升
构建时间30+ 秒3.4 秒88%↓
首页大小125 KB42 KB66%↓
Lighthouse859815%↑

内容统计

类型数量
博客文章113 篇
标签50+ 个
社交链接6 个
研究方向4 个
代表项目7 个

页面列表


💡 经验总结

什么做得好

  1. 充分准备 - 先调研技术选型,不盲目开始
  2. 自动化优先 - 能脚本化的不手动
  3. 小步快跑 - 分阶段实施,每步验证
  4. 保留备份 - 源文件完整保留,可随时回滚
  5. 文档记录 - 实时记录过程和决策

什么可以改进

  1. 权限配置 - OpenCode 权限应该提前配置好
  2. 测试覆盖 - 应该在本地多测试几篇文章
  3. 渐进迁移 - 可以先迁移少量文章验证格式

给后来者的建议

  1. 先备份再操作 - git clone 源仓库到本地
  2. 写脚本处理重复工作 - 115 篇文章手动改会疯掉
  3. 保留原始文件 - 转换后的文件另存,不要覆盖源文件
  4. 逐步验证 - 每修复 10 篇就构建测试一次
  5. 准备好 Plan B - 自动化工具失败时要有手动方案

🔧 技术栈

前端

工具

开发环境

Node.js: v22.22.0
npm: 10.x
Python: 3.12

📝 下一步计划

短期(1-2 周)

中期(1-2 月)

长期(3-6 月)


🙏 致谢


🔗 相关链接


作者: CloudZun
标签: #网站重构 #AstroPaper #博客迁移 #技术实践
发布时间: 2026-03-21 13:45 UTC
阅读时间: 约 15 分钟


编辑此文章
Share this post on:

Previous Post
OpenClaw 与 OpenCode 协同编码:ACPX 权限策略最佳实践
Next Post
OpenClaw ACPX 权限系统详解:从一次权限拒绝错误说起