Skip to content

build: 使用 Electron Forge 替换 electron-vite,并适配 ESLint 10 - #443

Open
canvascat wants to merge 9 commits into
SPlayer-Dev:devfrom
canvascat:feat/electron-forge
Open

canvascat wants to merge 9 commits into
SPlayer-Dev:devfrom
canvascat:feat/electron-forge

Conversation

@canvascat

Copy link
Copy Markdown

改动类型

  • 新功能(feat)
  • 缺陷修复(fix)
  • 重构 / 优化(不改变对外行为)
  • 文档(docs)
  • 其他(请在「改动说明」中注明):构建工具链迁移(electron-vite → Electron Forge)与 ESLint 10 适配

是否包含破坏性变更

  • 是(请在「改动说明」中详细描述)
  • 否

对用户无破坏性变更:安装包格式、文件名、dist/ 输出目录与 electron-updater 三个更新通道(stable / beta / nightly)保持不变,已安装用户可原地升级。开发侧的命令变化见下方「开发侧变化」

改动说明

一、electron-vite 迁移到 Electron Forge

开发、编译、打包、制作安装包全部由 Electron Forge 驱动;安装包仍由 electron-builder 生成(项目内 maker 以 prepackaged 模式调用),因此保留 NSIS 自定义安装、portable 版与 electron-updater

  • forge.config.ts + vite.{main,preload,renderer}.config.ts 取代 electron.vite.config.ts;主进程与 preload 保持 ESM 输出到 .vite/build
  • 主进程:新增 window/renderer.ts 的 loadRendererPage 统一加载渲染页面(替代 ELECTRON_RENDERER_URL);?asset 导入与 __dirname 改为 import.meta.dirname
  • scripts/forge/hooks.ts:packageAfterCopy 复制 better-sqlite3 / font-list(按目标平台裁剪预编译文件)、native/*.node、afp、app-update.yml、LICENSE,并裁剪 Chromium 语言文件,替代原 scripts/after-pack.ts 与 electron-builder 的 files / extraResources
  • scripts/forge/maker.ts:继承 @electron-forge/maker-base,调用 electron-builder build() 生成 nsis / portable / dmg / zip / AppImage / deb / rpm / tar.gz / pacman
  • 纯 JS 依赖打进主进程 bundle,仅 better-sqlite3、font-list 运行时从 node_modules 加载
  • pnpm-workspace.yaml 显式声明默认的 hoistPattern: ["*"] 以通过 Forge 的包管理器检查,依赖布局不变
  • 移除 electron-vite 配套的 @electron-toolkit/preload、@electron-toolkit/utils、@electron-toolkit/tsconfig:
    • window.electron 去除,关于页版本号改由 window.api.system.versions 提供
    • optimizer.watchWindowShortcuts 改为 window/shortcuts.ts 自行实现:继续拦截开发者工具与缩放快捷键、开发环境 F12,但不再拦截 Ctrl/Cmd+R——原拦截会连同页面按键一起屏蔽,导致「切换循环模式」默认快捷键 CommandOrControl+R 在打包版中失效
    • tsconfig 基础配置内联为 tsconfig.base.json,内容与原包一致
  • CI 构建命令改为 pnpm build:<platform> --arch=<arch>,文档同步更新

二、ESLint 10 适配

@electron-toolkit/eslint-config-ts 内置 @eslint/js 9,与项目的 ESLint 10 不匹配,ESLint 10 新增的推荐规则未生效

  • 改为直接依赖 @eslint/js 10、typescript-eslint、globals,原包配置内联到 eslint.config.mts,规则选项不变
  • 修复新规则 preserve-caught-error(补充 cause)与 no-useless-assignment(去掉会被覆盖的初始值)在现有代码中的 14 处报错,不改变运行行为
  • lint-staged 覆盖 .mts / .cts

开发侧变化

  • pnpm dev / pnpm start 改用 electron-forge start;pnpm build / build:unpack 输出到 out/SPlayer-Next-<platform>-<arch>/
  • pnpm build:win nsis 这类只构建部分 target 的写法不再可用(forge make 不会把额外参数传给 electron-builder),文档改为 --arch 用法
  • 构建产物目录由 out/main 等变为 .vite/

关联 Issue

无

测试情况

  • 本地 macOS arm64(Node 24、pnpm 12):
    • pnpm format 后 prettier --check、pnpm typecheck、pnpm lint、pnpm test(node 55 + vitest 557)全部通过
    • pnpm dev:主窗口、桌面歌词、灵动岛均从 dev server 加载,渲染进程 HMR 生效且不整页刷新,SQLite 曲库、FLAC 解码、插件 host、托盘正常
    • pnpm build:mac --arch=arm64:dmg / zip / blockmap / latest-mac.yml 文件名与迁移前一致,dmg 体积 −2.6%,app.asar 19M → 5.7M;dmg 安装后运行正常
    • 打包版真实按键验证:Cmd+R 切换循环模式且页面不刷新,开发者工具与缩放快捷键被拦截
    • 内存:迁移前后产物(同一份原生模块)交替各启动两次,60 秒采样各进程均值差异在 ±10% 内
  • CI(fork 上手动触发 Build Dev,基于本 PR 最新提交):macOS arm64 / Windows x64 / Linux x64 全部成功;解包检查 Windows NSIS 与 Linux deb:原生模块、app-update.yml、better-sqlite3 平台裁剪、语言文件裁剪、deb 的 package-type 均符合预期
  • 未覆盖:Build Dev 不产出 latest*.yml,Windows / Linux 的更新元数据需在 nightly / release 流程中确认(mac 本地已确认 latest-mac.yml 正常生成)

自查清单

  • 本 PR 只包含一个主要功能 / 修复,没有夹带无关改动(包含 Forge 迁移与 ESLint 10 适配两部分,见上文)
  • 已在本地完整测试通过;AI 生成的代码同样自行测试并审阅过,未做未经验证的提交
  • 已运行 pnpm format,并确认 pnpm typecheck、pnpm lint 通过
  • 改动涉及原生模块时已 pnpm build:native 验证;未手写 native/*/index.d.ts
  • 已向 dev 分支提交

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants