项目地址:GitHub Repository
在线预览:Live Demo
技术栈:React 18 + TypeScript + Rsbuild + MapLibre GL + ical.js
告别第三方服务,自建一个现代化的个人主页
背景:为什么选择自建?
前段时间,Bento 宣布停止维护。我厌倦了第三方服务的不稳定性,也尝试继续寻找一个 UI 风格能满足我审美的同类型站点,但始终没有找到满意的。
于是,我决定自建一个完全可控的个人主页,既能满足需求,又能完全掌控数据和功能。
项目介绍
这是一个采用 iOS 风格毛玻璃设计的个人主页/导航页项目,UI灵感来自于 yysuni。项目采用现代化的技术栈,实现了内容与展示的完全分离,所有配置都集中在一个文件中管理。
核心特性
🎨 精美的视觉设计
- 毛玻璃效果:使用
backdrop-filter实现 iOS 风格的毛玻璃效果 - 圆润的圆角:统一的 24px 圆角设计
- 柔和的阴影:精心设计的阴影和高光效果
- 流畅的动画:所有交互都有平滑的过渡动画
📦 丰富的功能模块
1. 用户信息卡片
- 展示头像、用户名和个性化标签
- 自定义导航菜单,支持多个链接入口
2. 文章展示
- 自动抓取博客最新文章(通过构建时插件)
- 显示文章标题、日期和分类
- 支持点击跳转到原文
3. 音乐播放器
- 随机播放功能
- 实时进度显示
- 播放/暂停控制
- 自动扫描
public/bgm目录生成播放列表
4. 实时时钟
- 数字时钟显示
- 实时更新当前日期
5. 日历组件 ⭐ 新功能
- 月历视图,高亮显示当天
- 支持 ICS 文件解析,自动标记节假日
- 鼠标悬停显示节日名称浮窗
- 使用专业的
ical.js库解析标准 iCalendar 格式
6. 世界地图 ⭐ 新功能
- 基于 MapLibre GL 的交互式地图
- 支持标记旅行地点、居住地、愿望地点等
- 点击标记点显示地点信息
- 支持全屏查看
- 可自定义地图样式
7. 社交链接
- 快速访问各个社交平台
- 支持多种图标样式
8. 图片展示
- 可自定义的图片卡片
- 支持多张图片展示
技术栈选择
前端框架
- React 18 + TypeScript:现代化的前端开发体验
- Rsbuild:基于 Rspack 的快速构建工具,构建速度极快
样式方案
- 纯 CSS:使用 CSS 变量和现代 CSS 特性实现毛玻璃效果
- 无 UI 框架:完全自定义样式,保持轻量
功能库
- Day.js:轻量级日期处理库
- ical.js:专业的 ICS 文件解析库
- MapLibre GL:开源的地图渲染库(无需 API Key)
- Lucide React:现代化的图标库
- Cheerio:服务端 HTML 解析(构建时使用)
核心设计理念
1. 配置驱动
所有内容都通过 src/config/content.ts 文件集中管理:
export const contentConfig: ContentConfig = {
user: {
name: '刷新',
tag: 'Arknights Players | Nikon & Lumix Users | ...',
avatar: 'https://...',
menuItems: [...],
},
calendar: {
icsUrl: '/中国大陆节假日.ics',
},
worldMap: {
style: '/positron.json',
markers: [...],
},
// ... 其他配置
};
优势:
- 修改内容无需改动组件代码
- 类型安全,TypeScript 保证数据正确性
- 易于维护和扩展
2. 构建时数据生成
通过自定义 Rsbuild 插件,在构建时自动生成数据:
FetchBlogPlugin - 自动抓取博客最新文章
// 构建时自动抓取博客首页
// 提取最新文章信息
// 生成 blog-data.json
BgmListPlugin - 自动扫描音乐文件
// 扫描 public/bgm 目录
// 生成音乐列表 JSON
// 自动更新到配置中
优势:
- 构建时生成,运行时无需 API 调用
- 减少运行时依赖
- 提升页面加载速度
3. 组件化设计
每个功能都是独立的组件,采用统一的目录结构:
components/
├── Calendar/
│ ├── Calendar.tsx
│ ├── Calendar.css
│ └── index.ts
├── WorldMap/
│ ├── WorldMap.tsx
│ ├── WorldMap.css
│ └── index.ts
└── ...
优势:
- 易于维护和扩展
- 组件可复用
- 清晰的代码组织
特色功能详解
📅 日历组件:ICS 文件支持
日历组件支持标准的 ICS (iCalendar) 格式文件,可以显示节假日和自定义事件:
calendar: {
icsUrl: '/中国大陆节假日.ics', // 本地路径或远程 URL
}
功能特点:
- 使用
ical.js解析标准 ICS 格式 - 自动标记有事件的日期(绿色背景 + 小圆点)
- 鼠标悬停显示节日名称浮窗
- 支持跨天事件
- 支持本地文件和远程 URL
使用场景:
- 显示节假日(如中国大陆节假日)
- 显示个人日程安排
- 显示重要事件提醒
🗺️ 世界地图:标记你的足迹
世界地图组件可以标记你去过的地方、居住地、想去的地方等:
worldMap: {
style: '/positron.json', // 自定义地图样式
markers: [
{
name: '北京',
lat: 39.9042,
lng: 116.4074,
type: 'travel', // travel | residence | wish | airport
description: '中国北京',
},
],
legend: [
{ type: 'travel', label: '旅行' },
{ type: 'residence', label: '居住' },
],
}
功能特点:
- 基于 MapLibre GL,无需 API Key
- 支持多种标记类型(旅行、居住、愿望、机场)
- 交互式地图,支持缩放、拖拽
- 点击标记点显示地点信息
- 支持全屏查看
- 自动处理相同位置的标记点重叠
项目结构
index-page/
├── public/ # 静态资源
│ ├── bgm/ # 音乐文件目录
│ ├── *.ics # ICS 日历文件
│ └── *.json # 地图样式文件
├── plugins/ # 自定义 Rsbuild 插件
│ ├── fetch-blog-plugin.ts # 博客文章抓取
│ └── bgm-list-plugin.ts # 音乐列表生成
├── src/
│ ├── components/ # React 组件
│ ├── config/ # 配置文件
│ │ ├── content.ts # 主配置文件
│ │ ├── blog-data.json # 博客数据(自动生成)
│ │ └── bgm-data.json # 音乐列表(自动生成)
│ └── App.tsx # 主应用组件
└── rsbuild.config.ts # Rsbuild 配置
自建的优势
1. 完全可控
- 所有代码和数据都在自己掌控中
- 可以随时修改和扩展功能
- 不受第三方服务限制
2. 数据安全
- 数据存储在本地或自己的服务器
- 不会因为第三方服务关闭而丢失数据
- 可以完全控制数据的访问权限
3. 功能定制
- 可以根据需求添加新功能
- 可以自定义样式和交互
- 不受第三方服务的功能限制
4. 性能优化
- 构建时生成数据,减少运行时请求
- 可以针对性地优化性能
- 完全控制资源加载
5. 学习价值
- 深入理解前端开发流程
- 学习现代前端技术栈
- 提升工程化能力
快速开始
安装依赖
pnpm install
开发模式
pnpm run dev
构建生产版本
pnpm run build
配置内容
编辑 src/config/content.ts 文件,修改对应的配置项即可。
总结
自建个人主页虽然需要一些开发成本,但带来的好处是显而易见的:
- 完全可控:不再依赖第三方服务,数据在自己手中
- 功能丰富:可以根据需求自由扩展功能
- 性能优秀:构建时生成数据,运行时性能极佳
- 易于维护:配置驱动,修改内容无需改动代码
- 学习价值:深入理解现代前端开发流程
如果你也厌倦了频繁更换第三方服务,或者想要一个完全属于自己的个人主页,不妨试试自建。这个项目已经为你搭建好了基础框架,你只需要修改配置就能拥有一个精美的个人主页。
本文介绍了自建个人主页的动机、技术实现和优势。如果你对这个项目感兴趣,欢迎 Star 和 Fork!