2936 字
15 分钟
GitHub + EdgeOne 搭建个人博客的过程
Technical
2025-02-08
0 次
0 人

想要一个属于自己的博客,但不知道从哪里开始?本文详细记录了从零开始搭建个人博客的全过程,包括踩过的各种坑和解决方案。

为什么选择 Fuwari 主题?#

在决定搭建博客之前,我对比了多个静态博客生成器:

工具优点缺点
Hexo插件丰富、中文文档多生成速度慢、配置复杂
Hugo构建极快学习曲线陡峭
VuePressVue 生态友好主要用于文档
Astro性能卓越、配置简单相对较新

最终选择了基于 Astro 5.7+Fuwari 主题,原因很简单:

  • 零配置即可使用
  • 完美适配移动端
  • 内置深色模式
  • 性能评分接近满分

一、前期准备#

1.1 所需账号#

在开始之前,你需要准备:

服务用途是否必需
GitHub 账号代码托管必需
EdgeOne 账号静态网站部署必需
Gitee 账号图床(可选)可选

1.2 环境要求#

Terminal window
# 检查 Node.js 版本(需要 18.0+)
node -v
# 推荐:使用 pnpm 作为包管理器
npm install -g pnpm

二、克隆与配置#

2.1 克隆项目#

Terminal window
# 克隆 Fuwari 项目
git clone https://github.com/saicaca/fuwari.git my-blog
cd my-blog
# 安装依赖
pnpm install

2.2 启动开发服务器#

Terminal window
pnpm dev

访问 http://localhost:4321/ 即可看到效果。

2.3 基本配置#

编辑 src/config.ts 文件:

// 站点基本信息
export const siteConfig: SiteConfig = {
title: "你的博客标题",
subtitle: "副标题描述",
lang: "zh_CN",
url: "https://your-domain.com",
author: "你的名字",
};
// 个人信息卡片
export const profileConfig: ProfileConfig = {
name: "你的名字",
bio: "个性签名",
avatar: "/avatar.jpg", // 头像放在 public/ 目录
email: "your-email@example.com",
socialLinks: {
github: "https://github.com/your-username",
// 添加更多社交链接...
},
};

三、部署到 EdgeOne#

3.1 为什么选择 EdgeOne?#

对比了多个部署平台:

平台优点缺点选择
Vercel体验好、速度快国内访问慢
Netlify功能强大国内访问慢
EdgeOne国内访问快、免费额度充足需要备案域名

3.2 部署步骤#

步骤 1:创建 GitHub 仓库#

Terminal window
# 初始化 git 仓库
git init
git add .
git commit -m "Initial commit"
# 推送到 GitHub
git remote add origin https://github.com/your-username/your-repo.git
git branch -M main
git push -u origin main

步骤 2:EdgeOne 配置#

  1. 登录 EdgeOne 控制台
  2. 选择「静态网站」→「新建站点」
  3. 连接 GitHub 仓库,选择分支:main

步骤 3:构建设置#

框架预设: Astro
根目录: ./
输出目录: dist
编译命令: pnpm run build
安装命令: pnpm install

步骤 4:开始部署#

点击「开始部署」,等待 1-2 分钟即可完成。

四、踩过的坑(重点!)#

坑 1:YAML Frontmatter 格式错误#

现象:文章发布后只显示标题,没有封面、摘要、正文。

原因:YAML 格式极其严格,任何一个空格错误都会导致解析失败。

❌ 错误写法#

---
title:文章标题
published:2026/02/04
category:软件安利
tags: 标签1, 标签2
draft: True
---

✅ 正确写法#

---
title: 文章标题 # 冒号后必须有空格
published: 2026-02-04 # 日期必须用连字符
category: 技术教程 # 冒号后必须有空格
tags: [标签1, 标签2] # 必须用数组格式
draft: true # 布尔值必须小写
---

YAML 四大黄金规则

  1. 冒号后必须有空格

    title: 文章标题 # ✅ 正确
    title:文章标题 # ❌ 错误
  2. 日期必须用连字符

    published: 2026-02-04 # ✅ 正确
    published: 2026/02/04 # ❌ 错误
  3. 标签必须用数组格式

    tags: [Astro, 教程, 前端] # ✅ 正确
    tags: Astro, 教程, 前端 # ❌ 错误
  4. 布尔值必须小写

    draft: true # ✅ 正确
    draft: True # ❌ 错误
    draft: TRUE # ❌ 错误

坑 2:导航栏抖动问题#

现象:点击「归档」「友链」等页面时,顶部导航栏会抖动一下。

原因:页面切换时 page-height-extend 元素的显示/隐藏导致高度变化。

解决方案

  1. 移除 top-rowtransition-all 过渡动画
  2. 在 Swup 钩子中禁用 onload-animation
  3. 完全移除 page-height-extend 逻辑

修改 src/layouts/Layout.astro

window.swup.hooks.on('visit:start', (visit) => {
// 禁用导航时的动画,防止抖动
const animatedElements = document.querySelectorAll('.onload-animation');
animatedElements.forEach(el => {
el.style.opacity = '1';
el.style.animation = 'none';
});
});

坑 3:页面加载时颜色闪烁#

现象:刷新网页时会闪一下另一种配色,然后才变成正确的颜色。

原因:CSS 样式加载有延迟,导致使用了默认样式。

解决方案:在 <head> 中添加内联样式

修改 src/layouts/Layout.astro

<head>
<!-- 其他 head 内容 -->
<!-- 内联渐变样式,防止闪烁 -->
<style is:inline>
.navbar-title-gradient,
.navbar-title-gradient-icon,
.gradient-text,
.hacker-icon,
.category-title,
.decoration-title {
background: linear-gradient(135deg, #0ea5e9, #8b5cf6) !important;
-webkit-background-clip: text !important;
-webkit-text-fill-color: transparent !important;
background-clip: text !important;
}
</style>
</head>

坑 4:深色模式颜色不和谐#

现象:深色模式下,某些元素的颜色显得突兀。

原因:使用了固定的颜色值(如 #A8C398),没有跟随主题色。

解决方案:将所有固定颜色改为使用 CSS 变量 var(--primary)

/* ❌ 错误:固定颜色 */
color: #A8C398;
/* ✅ 正确:主题色变量 */
color: var(--primary);

深色模式下使用 oklch 色空间的半透明颜色:

.dark .decoration-line {
border-color: oklch(0.35 0.02 var(--hue));
}

坑 5:Svelte 组件编译错误#

现象:搜索组件在开发服务器中无法正常显示。

原因<style> 标签缺少 lang 属性,导致 Svelte 编译器无法正确解析。

解决方案:为 <style> 标签添加 lang="css" 属性

<!-- ❌ 错误:缺少 lang 属性 -->
<style>
.search-panel {
background-color: var(--float-panel-bg-opaque);
}
</style>
<!-- ✅ 正确:添加 lang 属性 -->
<style lang="css">
.search-panel {
background-color: var(--float-panel-bg-opaque);
}
</style>

坑 6:图片加载延迟#

现象:打开网站时,左侧二维码和封面图片有明显延迟。

原因:默认使用了 loading="lazy" 延迟加载。

解决方案

  1. 关键图片移除 loading="lazy"
  2. 添加 loading="eager"fetchpriority="high"
  3. 外部图片下载到本地托管

修改 src/components/misc/ImageWrapper.astro

<img
src={src}
alt={alt}
loading="eager"
fetchpriority="high"
/>

坑 7:分类对齐问题#

现象:文章分类的名称和数字对齐不统一。

尝试的方案

  1. 使用固定宽度 width: 80px → 数字多的时候溢出
  2. 使用 text-align: left → 不美观
  3. 使用 justify-content: center → 数字没有靠右

最终方案

.category-name {
flex: 1; /* 占据剩余空间 */
text-align: center; /* 名称居中 */
}
.category-count {
/* 数字自然靠右 */
}

使用 flex: 1 让名称占据剩余空间并居中,数字徽章自然靠右。

坑 8:文章导入时图片 URL 错误#

现象:批量导入文章后,有些封面图显示无效。

原因:正则表达式匹配到了错误的图片 URL,例如:

image: generate: # ❌ 这不是有效 URL

实际内容是 ![image: generate:](https://...)

解决方案:添加 URL 验证

// 只接受有效的 URL 格式
if (url.match(/^https?:\/\//) || url.match(/^\//)) {
coverImage = url;
}

坑 9:EdgeOne 构建时 import.meta.glob 不工作#

现象:本地开发正常,但 EdgeOne 构建后数据不显示。

原因import.meta.glob 在 EdgeOne 构建环境下无法正确加载 JSON 文件。

错误代码

---
// ❌ 在 EdgeOne 构建时不工作
const sponsorFiles = import.meta.glob('../../data/sponsors/*.json', { eager: true });
const sponsors = Object.values(sponsorFiles).map(m => m.default);
---

解决方案:将数据直接内联到文件中

---
// ✅ 直接内联数据
const sponsors = [
{ "name": "赞助者1", "avatar": "https://...", "date": "2026-01-01" },
{ "name": "赞助者2", "avatar": "https://...", "date": "2026-01-02" },
// ...更多数据
];
---

经验教训:在 EdgeOne 等云端构建环境中,尽量避免使用动态导入,对于静态数据直接内联更可靠。

坑 10:浮动按钮挡住大纲#

现象:文章页面的评论/回到顶部按钮挡住了右侧大纲的部分区域。

原因:按钮位置设置过高。

解决方案:调整浮动按钮的 bottom

修改 src/components/control/BackToTop.astro

.back-to-top-btn
// 从 bottom: 10rem 改为 bottom: 6rem(向下移动 4rem)
#go-to-comments-btn
// 从 bottom: 14.5rem 改为 bottom: 10.5rem(向下移动 4rem)

五、配色系统设计#

设计理念#

博客采用冷紫蓝系作为唯一签名色,打造冷静编辑部的视觉氛围。

设计原则

  1. 背景作为舞台 - 更深的背景,更浅的卡片
  2. 标题作为判断 - 更强的视觉层次
  3. 极端色彩克制 - 最少的颜色,创造可记忆的身份

配色方案#

主题配置src/config.ts):

themeColor: {
hue: 268, // 冷紫蓝系
fixed: true,
}

颜色应用

元素颜色说明
背景色oklch(0.12 0.01 268)深色纯色背景
主题渐变#0ea5e9 → #8b5cf6蓝紫渐变,用于标题和图标
分类悬停#b7f605 + 黑字亮绿色点缀,唯一暖色

渐变元素#

使用蓝紫渐变的元素:

  • 导航栏网站名称和图标
  • 分类标题(“文章分类”)
  • 公众号标题
  • Hacker 风格装饰图标

内联样式(防止 FOUC 闪烁):

<style is:inline>
.navbar-title-gradient,
.navbar-title-gradient-icon,
.gradient-text,
.hacker-icon,
.category-title,
.decoration-title {
background: linear-gradient(135deg, #0ea5e9, #8b5cf6) !important;
-webkit-background-clip: text !important;
-webkit-text-fill-color: transparent !important;
background-clip: text !important;
}
</style>

六、特色功能实现#

6.1 评论/回到顶部浮动按钮#

右下角浮动按钮,提供快捷导航:

功能特性

  • 默认显示”评论”按钮,点击跳转到评论区
  • 点击后切换为”回到顶部”按钮
  • 位置下移避免挡住大纲

修改文件src/components/control/BackToTop.astro

6.2 表格样式优化#

表格采用表头浅色、数据行深色的配色方案:

样式配置src/styles/markdown-extend.styl):

thead th
background: var(--btn-plain-bg-hover) // 表头:浅色
tbody tr
background: var(--btn-regular-bg) // 数据行:深色

6.3 自动提取封面和摘要#

无需手动填写,系统自动处理:

---
title: 文章标题
published: 2026-02-06
tags: [标签]
category: Technical
# 无需填写 image 和 description
---
第一段文字会自动成为摘要...
文章正文...
  • 封面:自动提取第一张图片
  • 摘要:自动提取第一段文字(文章页隐藏,避免重复)

6.4 微信二维码弹窗#

点击微信图标弹出霓虹灯风格弹窗,支持一键复制微信号。

修改 src/layouts/MainGridLayout.astro 添加弹窗 HTML 和 JavaScript。

6.5 Giscus 评论区#

基于 GitHub Discussions 的评论系统,无需数据库。

配置步骤

  1. 在 GitHub 仓库启用 Discussions
  2. 访问 https://giscus.app 获取配置
  3. 更新 src/pages/posts/[...slug].astro
<div id="giscus-container"
data-repo="你的用户名/仓库名"
data-repo-id="R_kgDOxxxxxxxxx"
data-category="Announcements"
data-category-id="DIC_kwDOxxxxxxxxx"
data-mapping="pathname"
data-theme="preferred_color_scheme"
data-lang="zh-CN"
></div>

6.6 文章分类功能#

自动统计每个分类的文章数量,点击查看分类文章。

分类规则

分类关键词
SoftwareTypora, PicList, 快捷键, 图床, 工具
Technical教程, 部署, 搭建, 安装, 完整指南
AIHacksClaude, ChatGPT, GPT, 提示词, LLM

七、常用命令#

Terminal window
# 创建新文章
npm run new-post "文章标题"
# 启动开发服务器
npm run dev
# 构建生产版本
npm run build
# 预览构建结果
npm run preview
# 批量导入文章
node scripts/import-posts.cjs
# 更新文章分类
node scripts/update-categories.cjs

八、性能优化建议#

7.1 图片优化#

  • 使用 WebP 格式(体积更小)
  • 关键图片添加 fetchpriority="high"
  • 非关键图片使用 loading="lazy"

7.2 字体优化#

使用 CDN 加载霞鹜文楷字体:

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lxgw-wenkai-webfont@1.7.0/style.css" />

7.3 构建优化#

Astro 默认进行代码分割和 tree-shaking,无需额外配置。

九、总结#

时间分配#

任务耗时
项目配置1 小时
部署上线30 分钟
修复 YAML 问题2 小时
解决导航栏抖动1 小时
性能优化1 小时
修复构建问题1 小时
其他调整2 小时
总计约 9 小时

经验总结#

  1. YAML 格式极其严格:一个空格错误就会导致整篇文章无法显示
  2. 使用 CSS 变量:避免固定颜色值,让主题自动适配
  3. 关键资源优先加载:首屏图片不要使用 loading="lazy"
  4. 测试深色模式:确保在深色模式下也能正常显示
  5. 善用 Astro 的自动提取:减少手动填写的工作量
  6. 注意云端构建差异import.meta.glob 在云端可能不工作,静态数据直接内联更可靠

推荐资源#

下一步#

博客已经上线,接下来可以:

  1. 完善个人信息和社交链接
  2. 配置自定义域名(需要备案)
  3. 添加更多文章
  4. 优化 SEO(搜索引擎优化)
  5. 集成统计工具(如 Umami)

祝你搭建顺利!有任何问题欢迎在评论区留言。

这篇文章是否对你有帮助?

发现错误或想要改进这篇文章?

在 GitHub 上编辑此页