简介
经常有读者反馈:“不知道博客什么时候更新了”。为此,Lumin 主题新增了站内新文章订阅通知功能。
与传统的 RSS 订阅不同,这个功能不需要安装任何阅读器,也不需要配置邮件系统——当你再次访问博客时,工具栏上的铃铛图标会自动提示你有多少篇新文章。
原理
1你访问博客
2 ↓
3JS 读取 /index.xml(Hugo 自动生成的 RSS Feed)
4 ↓
5解析文章发布日期
6 ↓
7对比 localStorage 中的「最后访问时间」
8 ├─ 有新文章 → 铃铛按钮出现红色角标(如「3」)
9 └─ 无新文章 → 保持静默
10 ↓
11点击铃铛 → 展开面板展示最新文章列表
12 ↓
13关闭面板 → 记录当前时间为「已读」
整个过程完全在浏览器端完成,不需要任何后端服务、数据库或第三方平台。
特点
零服务架构
- ❌ 无需邮件服务器(SMTP)
- ❌ 无需数据库
- ❌ 无需第三方推送服务
- ❌ 无需注册登录
- ✅ 纯 JavaScript + localStorage
- ✅ RSS Feed 由 Hugo 自动生成,零维护
用户体验
- 角标提示:有新文章时铃铛按钮上显示红色数字,一眼可知更新数量
- 下拉面板:点击铃铛展开面板,展示最近 10 篇文章标题与发布时间
- 智能已读:关闭面板自动记录"已读"时间,下次只提示新更新的文章
- 缓存优化:RSS 数据在本地缓存 15 分钟,避免每次页面加载都重复请求
- 手动 RSS:面板底部提供 RSS 链接,习惯使用阅读器的用户仍可订阅
- 暗色模式:完整适配主题暗色模式
- 移动端适配:小屏设备自动缩小按钮和面板尺寸
技术细节
| 组件 | 文件 | 说明 |
|---|---|---|
| HTML 结构 | layouts/partials/toolbar.html | 铃铛按钮 + 角标 + 下拉面板 + RSS 链接 |
| 核心逻辑 | assets/js/modules/subscription.js | RSS 拉取、XML 解析、时间对比、UI 渲染 |
| 样式 | assets/css/main.css | 按钮/面板完整样式,暗色模式适配 |
| 注册 | assets/js/main.js | ES Module 导入 |
核心代码片段(约 60 行关键逻辑):
1// 1. 从 localStorage 读取最后访问时间
2var lastVisit = parseInt(localStorage.getItem('lumin_sub_lastvisit'), 10) || 0;
3
4// 2. 拉取 RSS 并解析
5fetch('/index.xml')
6 .then(function(r) { return r.text(); })
7 .then(function(xmlStr) {
8 var doc = new DOMParser().parseFromString(xmlStr, 'text/xml');
9 var items = doc.querySelectorAll('item');
10 // 遍历文章,对比发布时间
11 var newCount = 0;
12 items.forEach(function(item) {
13 var ts = new Date(item.querySelector('pubDate').textContent).getTime();
14 if (ts > lastVisit) newCount++;
15 });
16 // 有更新 → 显示角标
17 if (newCount > 0) badge.textContent = newCount;
18 });
使用方式
无需任何配置,功能在部署后自动生效:
- 正常访问博客 → 铃铛按钮出现在右侧工具栏(火箭上方)
- 博客有新文章 → 再次访问时铃铛显示角标
- 点击铃铛 → 查看新文章列表
- 关闭面板 → 自动标记已读
提示:如果一直看不到角标,说明你已经读完了所有文章,或者这是你第一次访问本博客。
隐私说明
- 所有数据存储在浏览器本地(localStorage)
- 不发送任何网络请求(除 RSS Feed 同源请求外)
- 不追踪用户行为
- 不设 Cookie
留言评论
期待你的想法评论加载中