OTONEI 是一个基于 React 19 + Vite 8 的在线音乐搜索、播放、下载和收藏同步应用。
- 多音源搜索:网易云、酷我、JOOX、Bilibili
- 在线播放和音质选择:128、192、320、740、999
- 收藏、播放历史、搜索历史
- PWA 安装和更新提示
- Firebase 云端同步(可选)
- React 19
- Vite 8
- Context API + 自定义 Hooks
- Localforage / IndexedDB
- Firebase Auth / Firestore
- vite-plugin-pwa
- Vitest / ESLint / Prettier
要求:
- Node.js >= 20.19.0
- pnpm 10.33.0
安装和启动:
pnpm install
pnpm start默认开发地址是 http://localhost:3000。
复制 .env.example 为 .env.local。
| 变量 | 说明 | 默认值 |
|---|---|---|
REACT_APP_API_BASE |
音乐 API 入口 | /api-v1/api.php |
REACT_APP_FIREBASE_API_KEY |
Firebase API Key | 可选 |
REACT_APP_FIREBASE_AUTH_DOMAIN |
Firebase Auth 域名 | 可选 |
REACT_APP_FIREBASE_PROJECT_ID |
Firebase 项目 ID | 可选 |
REACT_APP_FIREBASE_STORAGE_BUCKET |
Firebase Storage Bucket | 可选 |
REACT_APP_FIREBASE_MESSAGING_SENDER_ID |
Firebase Sender ID | 可选 |
REACT_APP_FIREBASE_APP_ID |
Firebase App ID | 可选 |
REACT_APP_FIREBASE_MEASUREMENT_ID |
Firebase Measurement ID | 可选 |
不配置 Firebase 时,应用会进入本地/降级模式。
pnpm run lint
pnpm test
pnpm run format:check
pnpm run build
pnpm run serve推荐部署到 Cloudflare Pages。项目已包含:
functions/api-v1/[[path]].js:只代理/api-v1和/api-v1/api.php到上游api.phppublic/_routes.json:只让/api-v1命中 Pages Functions,静态资源不消耗 Functions 调用public/_redirects:SPA 路由回退到index.htmlpublic/_headers:静态资源安全头和基础缓存策略wrangler.toml:声明 Pages 输出目录和 Functions 兼容日期
构建命令:
pnpm run build输出目录:
build
建议环境变量:
NODE_VERSION=22.16.0
PNPM_VERSION=10.33.0
REACT_APP_API_BASE=/api-v1/api.php
vercel.json 已配置:
/api-v1->https://music-api.gdstudio.xyz/api.php/api-v1/api.php->https://music-api.gdstudio.xyz/api.php- 其他路径回退到 SPA 入口
docker build -t otonei .
docker run -d -p 80:80 --name otonei --restart always otoneiNginx 会提供静态文件,并代理 /api-v1 到音乐 API。
src/
components/ UI 组件
contexts/ 全局状态
hooks/ 自定义 Hooks
pages/ 页面
services/ API、存储、同步、音频服务
styles/ 样式
test/ 单元测试
utils/ 工具函数
functions/ Cloudflare Pages Functions
conf/ Nginx 配置
docs/ 补充文档
CI 会执行:
pnpm run format:checkpnpm run lintpnpm testpnpm run buildpnpm audit --prod
MIT