写在前面
距上次发布 Astro + Fuwari 的部署文章已经有一段时间了。这段时间里,我给博客陆续添加了不少功能,也踩了不少新坑。
如果说上一篇文章是「从零到一」,那这篇就是「从一到 N」——记录那些让博客从「能用」变成「好用」的优化过程。
文章会涵盖20+ 个功能模块的配置方法,并附上完整的文件结构和代码位置。希望能帮到正在打磨自己博客的朋友。
本文所有代码均已开源,完整项目可在 github.com/bg4jts/my-blog 查看。
一、为什么要「比完美更进一步」?
「完美」是个伪命题。但让博客更好用、更快、更有个性,是可以不断接近的目标。
我给自己定的标准很简单:
- 读者体验优先 —— 加载快、阅读舒服、交互顺手
- 维护成本可控 —— 能自动化的绝不手动
- 保持克制 —— 功能要有用,不要为了加而加
基于这三点,我陆续添加了下面这些功能。
二、基础功能回顾
2.1 环境配置
项目使用 pnpm 作为包管理器,在 Windows 下如果遇到安装失败,记得在 .npmrc 中添加:
node-linker=hoisted2.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 排序,再按日期排序。
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 仓库中。
配置步骤:
- 创建公开仓库并启用 Discussions
- 安装 Giscus GitHub App
- 在 giscus.app 获取配置参数
- 创建
src/components/widget/GiscusComment.astro - 在文章页面中引入
文件: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.jsonvercel.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.astro | Layout.astro |
| 键盘快捷键 | src/components/widget/KeyboardShortcuts.astro | Layout.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 |
| Giscus | giscus.app |
| Umami | umami.is |
博客的打磨是一个持续的过程。如果有新的想法或更好的实现方案,欢迎在评论区交流。