Rin v0.3.0 发布 🎉

发布日期: 2025年2月4日

我们很高兴地宣布 Rin v0.3.0 正式发布!这是一次重大的架构升级,带来了显著的性能提升和全新功能。

核心亮点

🚀 OAuth 组件自定义实现

我们重新实现了 OAuth2 组件,替换了之前的 elysia-oauth2 依赖:

  • 通用架构:支持任何 OAuth2 提供商,GitHub OAuth 作为默认内置
  • CSRF 防护:通过 state 参数验证提供强大的 CSRF 保护
  • 类型安全:完整的 TypeScript 类型支持
  • 零外部依赖:不再依赖可能不兼容的第三方 OAuth 库

⚡ 轻量级懒加载路由框架

这是本次更新最重要的架构变更之一。我们将 ElysiaJS 框架重构为自制的轻量级框架:

性能提升数据(在 Cloudflare Workers 环境测试):

指标重构前重构后提升
冷启动时间40~60ms~7ms86% ↓
Worker CPU 时间 (P90)~50ms~12ms76% ↓
Worker CPU 时间 (P99)~167ms~22ms87% ↓
打包后体积~800KB~150KB81% ↓

具体的优化于 2026-02-04 上线测试,可观察到显著的耗时降低

注:以上数据为开发环境测试值,生产环境表现可能因具体配置而异

技术亮点

  • 按需加载:根据请求路径动态加载对应的服务,无需预注册所有路由
  • 懒加载依赖:数据库、缓存、JWT、OAuth、S3 等依赖仅在首次访问时加载
  • 精简上下文:无需复杂的框架 overhead,每个请求只创建必要的上下文
  • 移除重量级依赖:删除了 Elysia、@elysiajs/*、typedi、reflect-metadata 等约 15 个包

📊 HyperLogLog UV 统计

我们将 UV(独立访客)统计从传统的记录遍历方式迁移到了 HyperLogLog 算法:

解决的问题

  • 原来的 UV 统计需要遍历所有访问记录,当文章有高流量时,查询开销极高
  • 数据库查询时间随访问量线性增长,导致性能瓶颈

改进效果

文章访问量旧方案查询时间新方案查询时间
6400~12ms~1.3ms

HLL 效果测试

bun test scripts/__tests__/hll-scale.test.ts
数据规模序列化大小估算误差
1000.39KB0.31%
10003.80KB0.31%
1000029.17KB0.33%
10000063.83KB0.21%
100000064.00KB0.77%
100000000064.00KB0.03%
  • 16384 个寄存器,误差率约 0.81%
  • 无论访问量多少,查询时间恒定在 O(1)
  • 每个文章的统计最高仅需 ~64KB 存储空间,可轻松统计数 10 亿级 UV

💾 CacheImpl 数据库持久化

为 CacheImpl 新增了数据库持久化支持:

  • 不再需要 S3:配置缓存现在可以直接存储在数据库中,适合小型部署
  • 灵活切换:通过 CACHE_STORAGE_MODE 环境变量在 databases3 模式间切换
  • 便捷配置更新:缓存配置现在可以通过 SQL 直接读取和更新

🛠️ 简化的本地开发

我们大幅简化了本地开发的难度:

  • 一键启动bun run dev 同时启动客户端和服务端
  • 自动配置:开发环境变量自动注入,无需手动配置
  • 热更新:代码修改后自动重新加载
  • 简化调试:统一的日志输出格式,便于排查问题

🔐 账号密码登录支持

除了 GitHub OAuth,我们现在还支持传统的账号密码登录方式:

  • 灵活配置:通过环境变量 ADMIN_USERNAMEADMIN_PASSWORD 启用
  • 独立页面:登录功能改为独立页面 /login,不再使用模态框,避免焦点问题
  • 个人资料管理:新增 /profile 页面,用户可以更新自己的头像和昵称
  • 更好的用户体验:登录页面和资料页面都包含完整的 Header 导航

✨ 易用性提升

  • 登录体验优化:修复了登录时输入框焦点重置的问题
  • 头像显示优化:未设置头像的用户也能正确显示登录状态
  • 页面结构统一:所有页面都包含一致的 Header 和 Footer

破坏性变更

API 客户端接口变更

由于不再使用 ElysiaJs,其配套的 Eden Treaty 也不再支持,我们重新为其封装了一套 API 调用服务以尽可能确保接口较小变动,但 API 接口仍有所变化:

旧代码(不再支持):

const feeds = await client.feed.index.get({ query: { page: 1 } });

新代码

const feeds = await client.feed.list({ page: 1 });

认证方式变更

过去通过后端重定向至前端 callback 路径以配置用户认证,这种方式要求后端能够精准获取并计算出前端完整的 callback url,增加了不稳定因素

OAuth 变量名称

GitHub OAuth 环境变量名称添加了 RIN_ 前缀,更早版本的环境变量 GITHUB_CLIENT_IDGITHUB_CLIENT_SECRET 已被移除:

  • GITHUB_CLIENT_IDRIN_GITHUB_CLIENT_ID
  • GITHUB_CLIENT_SECRETRIN_GITHUB_CLIENT_SECRET

迁移指南

  1. 更新前端构建命令:替换前端构建命令:bun bbun run build
  2. 更新 OAuth 变量名:如果使用 GitHub OAuth,更新环境变量名称
  3. 账号密码登录(可选):如需启用账号密码登录,设置 ADMIN_USERNAMEADMIN_PASSWORD 环境变量

已知问题

  • 重构后的接口可能存在不兼容情况,已在实际使用中验证修复
  • 登录框焦点问题已修复,改为独立登录页面

反馈与建议

如果您在使用过程中遇到任何问题或有改进建议,欢迎通过以下方式反馈:

感谢所有贡献者的辛勤工作!🎉


Rin 团队 敬上
2025年2月4日