首页
/ LX Music 桌面版(lx-music-desktop):基于 Electron + Vue 3 的音乐桌面应用架构与扩展能力实战

LX Music 桌面版(lx-music-desktop):基于 Electron + Vue 3 的音乐桌面应用架构与扩展能力实战

2026-09-05 22:37:58作者:冯梦姬Eddie

本文围绕 lx-music-desktop 仓库的 README 展开,梳理这个 Electron 桌面音乐应用的技术栈选型、三大扩展能力(Scheme URL、数据同步服务、开放 API)的实际实现入口、跨平台数据存储目录规则,以及从源码构建和贡献代码的完整路径。读完本文,你可以明确该项目的运行环境要求、外部调用方式与二次开发的落点文件。

lx-music-desktop 桌面版用户界面

项目定位与技术栈

lx-music-desktop(洛雪音乐助手桌面版)是一个基于 Electron 与 Vue 3 开发的免费音乐查找与播放软件。README 中声明的技术栈与平台支持如下:

  • 技术栈:Electron 30+、Vue 3
  • 已支持平台:Linux、macOS、Windows 7 及以上

对照仓库根目录的 package.json 可以核实具体的版本事实:

  • 当前项目版本为 2.12.2,入口文件为 ./dist/main.js(webpack 打包产物)
  • 开发依赖中锁定 electron: 40.9.2(满足 README 的 Electron 30+ 要求)、electron-builder: ^26.9.0 用于打包,electron-updater: 6.8.4 用于自动更新
  • 渲染层使用 vue: ~3.3.13vue-router: ~4.5.1
  • 构建体系为 webpack 5(webpack: ^5.106.2),样式走 less,SVG 使用 svg-sprite-loader 方案
  • 运行环境要求:node >= 22npm >= 8.5.2
  • 关键运行时依赖包括 better-sqlite3(本地数据库)、music-metadatanode-id3(音频元数据读写)、undici/needle(网络请求)、ws(同步服务的 WebSocket)

软件更新记录见仓库内的 CHANGELOG.md,常见问题见 FAQ.md(该文件头部注明详细内容已迁移至官方文档站,仓库内保留的是启动参数、Scheme URL 传参等关键参考内容)。

需要说明的是,项目默认设置与 UI 操作并不以新手友好为目标,README 建议用户首次使用前先按个人偏好浏览并调整一遍软件设置,了解音乐播放列表机制与鼠标、键盘快捷操作。

三大扩展能力

README 在「说明」章节列出了三个自某个版本起引入的扩展能力,下面逐一结合仓库源码说明其实现落点。

Scheme URL:从浏览器等外部场景调用 LX Music

README 声明:从 v1.17.0 起支持 Scheme URL,可以在浏览器等场景下调用 LX Music,官方配套开发了一个油猴脚本。实现链路在源码中清晰可查:

  1. 协议注册:src/main/app.ts 中调用 app.setAsDefaultProtocolClient('lxmusic', ...),把 lxmusic:// 协议绑定到当前可执行文件(L150-L152 附近),系统收到该协议链接时即拉起应用;
  2. 链接分发:渲染进程侧 src/renderer/core/useApp/useDeeplink/index.ts 负责解析。其 handleLinkAction 的解析逻辑为:去掉 lxmusic:// 前缀后按 / 拆分为 type / action / ...paths,再把 ? 后的 query 逐对解析为参数,若存在 data 参数则对其做 decodeURIComponent 后按 JSON 解析,最终按 type 分发到 musicsonglistplayer 三类处理器(分别对应 useMusicActionuseSonglistActionusePlayerAction 三个组合函数)。

结合仓库内 FAQ.md 的「Scheme URL支持」一节,实际可用的调用协议格式为:

  • URL 统一以 lxmusic:// 开头;源的可用值为 kw/kg/tx/wy/mg,音质可用值为 128k/320k/flac/flac24bit
  • data 方式传参:以 URL 编码后的 JSON 传参,例如 lxmusic://music/play?data=xxxx,支持复杂参数,例如播放歌曲需传 namesingersourcesongmidtypes 音质数组等字段
  • URL 方式传参(v1.18.0 新增):适用于简单传参,例如 lxmusic://music/search/kw/关键词lxmusic://songlist/open/kw/123456,数据仍需 URL 编码

数据同步服务

README 声明:从 v2.2.0 起发布了一个独立的数据同步服务,可将服务器部署为私人多端同步服务。桌面端对应的客户端与内嵌服务器实现位于 src/main/modules/sync 目录:

  • server/ 子目录实现了内嵌的同步服务器(server/modules/user/ 等子目录,其中 modules 下按功能拆分为列表、黑名单等 16 个模块文件,并带有 snapshotDataManage.ts 之类的快照管理实现)
  • client/ 子目录实现连接外部同步服务器的客户端逻辑(client.tsauth.tssync/ 等)
  • index.tslistEvent.tsdislikeEvent.ts 作为事件入口把同步能力挂接到主进程

从源码结构看,同步的数据范围覆盖歌曲列表与黑名单(dislike)两类,且快照机制(maxSnapshotNum 用户配置)用于同步冲突时的数据恢复。README 同时提示该功能为实验性,传输为明文,建议在受信任网络下使用。

开放 API 服务

README 声明:从 v2.7.0 起支持开放 API 服务,启用后在本地启动一个 HTTP 服务,提供播放器相关接口供第三方调用。实现位于 src/main/modules/openApi/index.ts,可以从中看到实际提供的能力:

  • 基于 Node 原生 http 模块创建本地服务,所有响应头统一携带 Access-Control-Allow-Origin: *,方便浏览器内第三方页面直接调用
  • global.lx.player_status 是播放器状态的全局单一数据源,HTTP 接口只负责按 filter 参数(逗号分隔的状态字段列表,缺省为 status/name/singer/albumName/lyricLineText/duration/progress/playbackRate)投影输出
  • 除一次性查询外,还支持 text/event-stream 的 SSE 订阅:客户端连接后服务端先推送一次全量状态,之后持续推送变更字段;歌词类字段(lyric/tlyric/rlyric/lxlyric)则通过专门的接口一次性返回
  • 服务状态(是否启用、监听地址)由模块内的 status 对象维护,供设置界面与 UI 展示

数据存储目录

README 给出的默认数据目录规则如下:

平台 数据目录
Linux $XDG_CONFIG_HOME/lx-music-desktop~/.config/lx-music-desktop
macOS ~/Library/Application Support/lx-music-desktop
Windows %APPDATA%/lx-music-desktop

此外,在 Windows 平台上,若程序文件夹中存在 portable 文件夹,则自动使用该文件夹作为数据存储目录(v1.17.0 及以上版本)。这一逻辑在 src/main/app.ts 中有直接实现(L128-L141 附近):

// windows平台下如果应用目录下存在 portable 文件夹则将数据存在此文件下
const portablePath = path.join(path.dirname(app.getPath('exe')), '/portable')
if (existsSync(portablePath)) {
  app.setPath('appData', portablePath)
  const appDataPath = path.join(portablePath, '/userData')
  app.setPath('userData', appDataPath)
}
const userDataPath = app.getPath('userData')
global.lxDataPath = path.join(userDataPath, 'LxDatas')

即:先检测便携模式并重定向 appData/userData,再基于 userData 拼接出实际的数据根目录 LxDatasglobal.lxOldDataPath 则保留迁移前的旧路径引用,配合 src/main/utils/migrate.ts 做数据迁移)。这一机制使得绿色版(portable)可以把全部数据留在程序目录内,便于整体拷贝迁移。

源码使用与贡献流程

README 的「贡献代码」与「源码使用方法」章节给出了明确的协作约定:

  • 添加新功能的 PR,建议先创建 Issue 确认需求;修复 bug 的 PR 需提供修复前后说明与重现方式
  • 开发流程:参照官方文档站「源码使用方法」搭建开发环境 → 克隆仓库并切换到 dev 分支 → 向 dev 分支提交 PR(而不是 master)

仓库内的 package.json 完整暴露了本地开发与打包命令,可作为「源码使用方法」的仓库内实证:

  • 本地开发:npm run dev(等价于 cross-env NODE_OPTIONS=--max-http-header-size=200000 node build-config/runner-dev.js,会同时启动主进程与渲染进程的开发流程)
  • 代码检查:npm run lint / npm run lint:fix(ESLint + standard 规则 + Vue 插件,覆盖 src.ts/.js/.vue
  • 构建打包:npm run build 执行 build-config/pack.js 总入口;细分构建包括 build:mainbuild:rendererbuild:renderer-lyricbuild:renderer-scripts 四个 webpack 产物(主进程、主界面、桌面歌词独立窗口、注入脚本),印证了 src 目录下 main / renderer / renderer-lyric / common 的四区源码结构
  • 发布打包:pack:winpack:macpack:linux 等脚本通过 build-config/build-pack.jstarget/arch/type 参数组合产出 Windows 安装版(setup)、绿色版(7z)、Linux 的 deb/rpm/pacman/AppImage 与 macOS 的 dmg,其中 pack:win7:* 专门针对 Windows 7 产出 win7_setup/win7_green 类型
  • 主题构建:npm run build:theme 调用 src/common/theme/createThemes.js 生成主题

FAQ 中还列出了与运行相关的启动参数(-search-dha 禁用硬件加速、-dt 非透明窗口、-proxy-server/-proxy-bypass-list 代理设置、-play 启动即播放指定列表等),是排查 Windows 7 界面异常、代理联网等问题的第一手参考。

项目协议要点

本项目基于 Apache License 2.0 发行(见 LICENSElicenses/ 目录),README 同时附加了一份补充协议,核心条款包括:

  • 数据来源:在线数据来自官方平台公开服务器拉取,经过筛选合并后展示;在线音频直链来自软件设置中「自定义源」返回的链接,项目本身不获取音频数据,也不校验其准确性
  • 版权数据:使用过程中产生的版权数据(图像、音频、名字等)项目不拥有所有权,要求使用者在 24 小时内清除
  • 使用限制:项目完全免费、面向技术学习交流,禁止在违反当地法律法规的情况下使用
  • 非商业性质:仅用于技术可行性探索与研究,不接受任何商业合作及捐赠
  • 接受方式:使用本项目即代表接受该协议,疑问可联系 README 文末给出的邮件(将 + 替换为 @

小结

lx-music-desktop 的仓库结构与 README 描述高度一致:Electron 主进程承载协议注册(Scheme URL)、内嵌同步服务器与开放 API 三项扩展能力,Vue 3 渲染层按 main / renderer / renderer-lyric 分区组织,数据目录规则通过 app.getPath 重定向实现了便携模式。对于希望集成、部署或二次开发的读者,建议从 src/main/app.ts 的启动流程、src/main/modules/openApi/index.ts 的接口定义与 package.json 的脚本入口三个文件入手,可以快速定位到本文所述各项功能的实际实现。

登录后查看全文
热门项目推荐
相关项目推荐