仿照 QQ 音乐移动端开发的音乐播放器应用,通过 Node.js 搭建数据转发服务获取 QQ 音乐接口数据,供个人本地使用,深入学习 HTML5 Audio API 及移动端交互体验。
项目内容
- 基于 Vue 2 + Vuex 搭建移动端 SPA,还原 QQ 音乐的核心 UI 与交互体验
- 使用 Node.js 搭建后端代理服务,转发 QQ 音乐 API 接口,解决跨域与接口鉴权问题
- 基于 HTML5 Audio API 封装音频播放器组件,支持播放/暂停、上一曲/下一曲、进度拖拽、音量调节
- 实现歌词滚动同步显示,基于时间戳解析 LRC 歌词格式并高亮当前播放行
- 开发推荐歌单、歌手列表、排行榜、搜索等核心页面模块
- 使用 Vuex 统一管理播放状态(播放列表、播放模式、当前曲目),支持顺序播放、随机播放、单曲循环
- 采用 better-scroll 实现移动端丝滑滚动与歌手列表字母索引快速跳转
技术亮点
完整音频播放器 Audio API
Node 数据转发 代理层
歌词同步 LRC 解析
移动端适配 flexible
项目难点与解决方案
HTML5 Audio 在移动端浏览器中存在诸多兼容性问题:iOS 禁止自动播放、部分安卓机型 canplay 事件不触发、切换歌曲时偶发播放中断等。
- 封装统一的 Player 类,内部管理 Audio 实例的生命周期,对外暴露 Promise 化的 play/pause/seek 方法
- 通过监听 canplay、timeupdate、ended、error 等事件,构建完整的播放状态机
- 针对 iOS 自动播放限制,在首次用户交互时触发静默 play() 解锁 Audio 上下文
- 切歌时先 pause → 重置 src → load → play,确保音频资源正确释放与加载
播放器在 iOS Safari、微信浏览器、各主流安卓浏览器中均可稳定运行
QQ 音乐接口有 Referer 校验和签名机制,前端直接请求会被拦截,需要服务端代理转发并伪装请求头。
- 使用 Express 搭建本地代理服务,通过 axios 在服务端转发请求并设置合规的 Referer 和 Origin 头
- 对热门接口(歌单列表、排行榜)增加内存缓存层,减少重复请求,提升响应速度
- 统一封装错误处理中间件,对接口异常返回友好的降级提示
本地代理稳定可靠,接口响应时间 < 200ms,缓存命中后 < 10ms