1704 字
9 分钟
Astro + Fuwari 博客深度优化全记录:比完美更进一步

写在前面#

距上次发布 Astro + Fuwari 的部署文章已经有一段时间了。这段时间里,我给博客陆续添加了不少功能,也踩了不少新坑。

如果说上一篇文章是「从零到一」,那这篇就是「从一到 N」——记录那些让博客从「能用」变成「好用」的优化过程。

文章会涵盖20+ 个功能模块的配置方法,并附上完整的文件结构和代码位置。希望能帮到正在打磨自己博客的朋友。

本文所有代码均已开源,完整项目可在 github.com/bg4jts/my-blog 查看。

bg4jts
/
my-blog
Waiting for api.github.com...
00K
0K
0K
Waiting...

一、为什么要「比完美更进一步」?#

「完美」是个伪命题。但让博客更好用、更快、更有个性,是可以不断接近的目标。

我给自己定的标准很简单:

  1. 读者体验优先 —— 加载快、阅读舒服、交互顺手
  2. 维护成本可控 —— 能自动化的绝不手动
  3. 保持克制 —— 功能要有用,不要为了加而加

基于这三点,我陆续添加了下面这些功能。


二、基础功能回顾#

2.1 环境配置#

项目使用 pnpm 作为包管理器,在 Windows 下如果遇到安装失败,记得在 .npmrc 中添加:

node-linker=hoisted

2.2 站点配置#

所有配置集中在 src/config.ts:

export const siteConfig = {
title: 'BG4JTS 的博客',
subtitle: '记录与思考',
lang: 'zh-CN',
themeColor: { hue: 220, fixed: false },
banner: { enable: true, src: '/images/banner.jpg', position: 'center' },
favicon: [...],
};
export const profileConfig = {
name: 'BG4JTS',
bio: '开发者 · 创作者',
avatar: '/avatar.jpg',
links: [...],
};

三、内容增强模块#

3.1 文章置顶#

功能:在文章 Frontmatter 中添加 sticky: true,即可将文章固定在列表最前面。

实现:修改 src/utils/content-utils.ts 中的排序逻辑,先按 sticky 排序,再按日期排序。

src/utils/content-utils.ts
const sorted = posts.sort((a, b) => {
if (a.data.sticky && !b.data.sticky) return -1;
if (!a.data.sticky && b.data.sticky) return 1;
return b.data.published.getTime() - a.data.published.getTime();
});

使用:

---
title: 置顶文章
sticky: true
---

(难绷写完才发现官方有这个功能)

3.2 文章更新提醒#

功能:在文章顶部显示「本文最后更新于 X 天前」,超过阈值天数时显示提醒。

文件:src/components/widget/UpdateNotice.astro

使用:在 src/pages/posts/[...slug].astro 中,标题下方添加:

<UpdateNotice published={entry.data.published} updated={entry.data.updated} thresholdDays={7} />

3.3 相关文章推荐#

功能:基于文章标签,自动推荐共享标签最多的 4 篇文章。

文件:src/components/widget/RelatedPosts.astro

使用:在文章底部添加:

<RelatedPosts currentSlug={entry.slug} tags={entry.data.tags || []} limit={4} />

四、阅读体验优化#

4.1 阅读进度条#

功能:页面顶部显示细长的阅读进度条,跟随滚动实时更新。

文件:src/components/widget/ReadingProgress.astro

使用:在 src/layouts/Layout.astro 的 <body> 开始处添加:

<ReadingProgress />

4.2 文章目录高亮#

功能:滚动文章时,右侧目录自动高亮当前阅读章节。

文件:src/components/widget/TocHighlight.astro

使用:在 src/pages/posts/[...slug].astro 的 </MainGridLayout> 后添加:

<TocHighlight />

4.3 键盘快捷键#

功能:支持 j/k 上下翻页、h 回到首页、t 回到顶部、? 显示帮助。

按键映射:

按键功能
j / J下一篇
k / K上一篇
h / H回到首页
t / T回到顶部
?显示快捷键帮助

文件:src/components/widget/KeyboardShortcuts.astro

使用:在 src/layouts/Layout.astro 的 </body> 前添加:

<KeyboardShortcuts />

五、社交互动模块#

5.1 Giscus 评论系统#

功能:基于 GitHub Discussions 的评论系统,评论数据存储在 GitHub 仓库中。

配置步骤:

  1. 创建公开仓库并启用 Discussions
  2. 安装 Giscus GitHub App
  3. 在 giscus.app 获取配置参数
  4. 创建 src/components/widget/GiscusComment.astro
  5. 在文章页面中引入

文件:src/components/widget/GiscusComment.astro

5.2 Umami 访问统计#

功能:轻量、隐私友好的网站分析。

配置:在 src/config.ts 中填写:

umamiConfig: {
enable: true,
baseUrl: 'https://cloud.umami.is',
shareId: '你的ShareID',
timezone: 'Asia/Shanghai',
},

5.3 分享组件#

功能:支持复制链接、复制标题+链接、QQ分享、二维码生成及 PNG/SVG 下载。

文件:src/components/misc/ShareButtons.astro

使用:在文章底部添加:

<ShareButtons url={Astro.url} title={entry.data.title} />

六、页面扩展#

6.1 友情链接页面#

功能:展示友链卡片,支持通过 JSON 数据管理,申请流程通过 GitHub PR 完成。

数据结构 src/data/links.json:

[
{
"name": "站点名",
"avatar": "头像URL",
"description": "一句话简介",
"url": "https://你的站点/"
}
]

文件:src/pages/links.astro

访问路径:/links/(配置了 trailingSlash: 'always',会自动重定向)

6.2 工具聚合框架#

功能:将多个独立工具部署在单独的 Vercel 项目中,通过 Cloudflare Worker 转发到 /tools/* 路径。

项目结构:

tools-hub/
├── public/
│ ├── hyw/ # 何意为
│ │ └── index.html
│ └── 工具名/
│ └── index.html
├── vercel.json # 路由重写配置
└── package.json

vercel.json:

{
"rewrites": [
{ "source": "/tools/:path*", "destination": "/:path*" }
]
}

七、部署与加速#

7.1 Vercel 部署#

项目托管在 Vercel,每次 git push 自动构建部署。

7.2 Cloudflare Workers 国内加速#

通过 Cloudflare Worker 做路径转发,实现国内访问加速。

Worker 代码:

export default {
async fetch(request) {
const url = new URL(request.url);
const path = url.pathname;
if (path.startsWith('/tools/')) {
const targetUrl = `https://tools-hub.vercel.app${path}`;
return fetch(new Request(targetUrl, request));
}
const targetUrl = `https://bg4jts.vercel.app${path}`;
return fetch(new Request(targetUrl, request));
}
};

关键配置:

  • DNS 记录开启 Cloudflare 代理(橙色云朵)
  • Worker 路由:*bg4jts.cn/*
  • 转发时保留 Host 头

八、文件结构总览#

src/
├── components/
│ ├── misc/
│ │ ├── ShareButtons.astro # 分享组件
│ │ └── License.astro # 版权信息
│ └── widget/
│ ├── GiscusComment.astro # 评论系统
│ ├── ReadingProgress.astro # 阅读进度条
│ ├── TocHighlight.astro # TOC 高亮
│ ├── RelatedPosts.astro # 相关文章
│ ├── UpdateNotice.astro # 更新提醒
│ └── KeyboardShortcuts.astro # 键盘快捷键
├── data/
│ └── links.json # 友链数据
├── layouts/
│ └── Layout.astro # 主布局(引用进度条、快捷键)
├── pages/
│ ├── links.astro # 友链页面
│ └── posts/
│ └── [...slug].astro # 文章页面(引用所有组件)
├── utils/
│ └── content-utils.ts # 文章排序(含置顶逻辑)
└── config.ts # 站点配置(含 Umami)

九、核心组件位置速查#

组件文件路径引用位置
阅读进度条src/components/widget/ReadingProgress.astroLayout.astro
键盘快捷键src/components/widget/KeyboardShortcuts.astroLayout.astro
文章更新提醒src/components/widget/UpdateNotice.astro[...slug].astro
TOC 高亮src/components/widget/TocHighlight.astro[...slug].astro
相关文章src/components/widget/RelatedPosts.astro[...slug].astro
分享组件src/components/misc/ShareButtons.astro[...slug].astro
评论系统src/components/widget/GiscusComment.astro[...slug].astro
文章置顶src/utils/content-utils.ts排序逻辑
友链页面src/pages/links.astro独立页面

十、一些优化心得#

关于功能选择#

不是所有功能都适合每个博客。我的原则是:

  • 读者能看到的功能(进度条、TOC、分享)优先做
  • 后台能省力的功能(置顶、友链 JSON 管理)值得做
  • 炫技但无用的功能(动态背景、音乐播放器)暂时不做

关于维护成本#

友链用 JSON + PR 流程管理,比在页面里硬编码好维护得多。数据与视图分离,更新友链不需要动代码。

关于性能#

Astro 本身已经足够快。新增的功能基本都是客户端 JavaScript,不会影响首屏加载速度。唯一要注意的是不要引入过大的第三方库。


十一、相关资源#

资源链接
完整源码github.com/bg4jts/my-blog
Fuwari 官方github.com/saicaca/fuwari
Astro 文档docs.astro.build
Giscusgiscus.app
Umamiumami.is

博客的打磨是一个持续的过程。如果有新的想法或更好的实现方案,欢迎在评论区交流。

Astro + Fuwari 博客深度优化全记录:比完美更进一步
https://bg4jts.cn/posts/astro-fuwari-ultimate-guide/
作者
BG4JTS
发布于
2026-09-06
许可协议
CC BY-NC-SA 4.0