【剪映小助手-客户端】构建与部署

4 阅读7分钟

构建与部署

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本指南面向 capcut-mate 桌面客户端的构建与部署,覆盖 Electron 应用的构建流程、打包配置、发布策略、版本管理、自动更新机制与签名验证流程,并提供开发环境配置、调试工具使用与生产环境部署的最佳实践。文档同时涵盖跨平台兼容性处理、安装包优化与分发渠道管理的实操建议。

项目结构

capcut-mate 的桌面客户端位于 desktop-client 目录,采用“主进程 + 预加载桥接 + React 前端”的典型 Electron 架构:

  • 主进程负责窗口生命周期、系统集成与 IPC 注册
  • 预加载脚本通过 contextBridge 暴露受控 API 给渲染进程
  • React 前端通过 Vite 构建并输出到 ui 目录供主进程加载
  • nodeapi 子模块封装下载、日志、配置等业务逻辑
  • scripts 目录包含 electron-builder 的多套打包配置与版本更新脚本
  • .github/workflows 提供 CI 流水线,支持 Windows 与 macOS 平台的安装包与绿色包构建、上传与发布
graph TB
subgraph "桌面客户端"
A["主进程 main.js"]
B["预加载 preload.js"]
C["React 前端(Vite)"]
D["NodeAPI(download.js, ipcHandlers.js, logger.js)"]
E["打包配置(electron-builder.config.js, green.config.js)"]
F["版本更新(update-version.js)"]
G["macOS 权限(entitlements.mac.plist)"]
end
A --> B
A --> C
A --> D
A --> E
F --> A
A --> G

核心组件

  • 构建脚本与打包配置
    • desktop-client/package.json 定义了开发、前端构建、打包与安装包生成脚本,以及 electron-builder 与 electron-packager 依赖
    • scripts/electron-builder.config.js 与 scripts/electron-builder-green.config.js 分别定义了标准安装包与绿色便携包的打包规则
  • 主进程与窗口管理
    • main.js 负责窗口创建、开发/生产模式切换、异常捕获与 IPC 初始化
  • 预加载与 API 暴露
    • preload.js 通过 contextBridge 暴露受限 API,供 React 前端调用
  • NodeAPI 业务逻辑
    • nodeapi/ipcHandlers.js 注册 IPC 处理函数,连接下载、日志、配置、历史记录等功能
    • nodeapi/download.js 实现草稿下载、路径解析、重试机制、日志与历史记录写入
    • nodeapi/logger.js 基于 log4js 的日志配置,输出到用户数据目录
  • macOS 权限与沙箱
    • assets/entitlements.mac.plist 配置沙箱与文件夹访问权限
  • 前端服务封装
    • web/src/services/electronService.js 提供浏览器与 Electron 环境的双态 API 封装
  • CI/CD 与版本管理
    • .github/workflows/desktop-client-dev.yml 定义多平台构建矩阵、安装包与绿色包产物上传、GitHub Release 发布
    • scripts/update-version.js 从 GitHub Ref 提取语义化版本并更新 package.json

架构总览

下图展示了从 CI 触发到产物发布的整体流程,以及主进程、预加载、前端与 NodeAPI 的交互关系。

sequenceDiagram
participant GH as "GitHub Actions"
participant DC as "desktop-client/package.json 脚本"
participant EB as "electron-builder"
participant WIN as "Windows 构建"
participant MAC as "macOS 构建"
participant ART as "产物(dist)"
participant REL as "GitHub Release"
GH->>DC : 触发构建矩阵
DC->>EB : 执行安装包/绿色包构建
EB->>WIN : 生成 exe/dmg/zip
EB->>MAC : 生成 dmg/zip
EB-->>ART : 输出安装包与绿色包
GH->>REL : 上传并发布

详细组件分析

构建脚本与打包配置

  • package.json 脚本职责
    • 开发与前端:启动主进程、前端开发服务器、前端构建
    • 传统打包:electron-packager 生成各平台二进制
    • 安装包打包:electron-builder 生成 NSIS(dmg) 安装包,支持 x64/arm64
    • 绿色包打包:electron-builder 生成 zip 包,便于便携使用
  • electron-builder 配置要点
    • Windows:NSIS 安装器、自定义产物命名、禁用签名算法(示例)
    • macOS:dmg 多架构目标、硬硬化运行时、Gatekeeper 放行、entitlements 配置
    • 文件过滤:排除 web、dist、脚本与配置文件,仅打包必要资源
    • 绿色包:显式包含 node_modules/ui/nodeapi/assets 等运行所需资源
  • 版本更新脚本
    • 从 GITHUB_REF 提取 tag,校验语义化版本,写回 package.json
flowchart TD
Start(["开始"]) --> CheckRef["检查 GITHUB_REF 是否为 tag"]
CheckRef --> |否| Skip["跳过版本更新"]
CheckRef --> |是| Parse["解析语义化版本"]
Parse --> Valid{"版本有效?"}
Valid --> |否| ExitErr["退出并报错"]
Valid --> |是| ReadPkg["读取 package.json"]
ReadPkg --> Update["更新 version 字段"]
Update --> WritePkg["写回 package.json"]
WritePkg --> Done(["结束"])

主进程与窗口管理

  • 窗口创建与图标适配:根据平台选择 icns/ico/png
  • 开发/生产模式:开发模式加载本地 Vite 服务,生产模式加载 ui/index.html
  • 安全配置:禁用 Node 集成、启用上下文隔离、预加载脚本、硬件加速
  • 异常处理:捕获未捕获异常,macOS 权限错误弹窗提示
  • 生命周期:窗口关闭与 macOS Dock 行为
sequenceDiagram
participant App as "Electron App"
participant MW as "主窗口"
participant Pre as "预加载脚本"
participant FE as "React 前端"
participant DL as "NodeAPI 下载"
App->>MW : createWindow()
MW->>Pre : 注入预加载脚本
alt 开发模式
MW->>FE : 加载 http : //localhost : 9000
else 生产模式
MW->>FE : 加载 ui/index.html
end
FE->>DL : IPC 调用(下载/日志/配置)
DL-->>FE : 返回结果与事件

预加载与 API 暴露

  • 通过 contextBridge.exposeInMainWorld 暴露受限 API,包括文件保存、草稿下载、日志、消息框、外部链接、配置、历史记录等
  • 渲染进程通过 window.electronAPI 调用,避免直接暴露 Node/Electron 能力

NodeAPI 业务逻辑

  • IPC 处理器注册:统一在 ipcHandlers.js 中集中注册,便于维护
  • 下载流程:解析草稿 URL -> 选择目标目录 -> 逐文件下载(含重试)-> 写入日志与历史记录 -> 可选打开目录
  • 日志系统:基于 log4js,按日切割,保留 7 天备份
  • 权限与错误处理:目录权限校验、网络错误分类、UI 反馈与日志记录
flowchart TD
S(["开始下载"]) --> GetCfg["读取配置/选择目录"]
GetCfg --> ParseURL["解析目标文件路径"]
ParseURL --> Loop{"遍历文件列表"}
Loop --> |是| Retry["带重试下载(最多3次)"]
Retry --> Ok{"成功?"}
Ok --> |是| LogOk["写入成功日志"]
Ok --> |否| LogFail["写入失败日志"]
LogOk --> Next["下一个文件"]
LogFail --> Next
Next --> Loop
Loop --> |否| Hist["写入历史记录"]
Hist --> Done(["完成"])

前端服务封装与跨环境兼容

  • electronService.js 提供浏览器与 Electron 环境的双态 API 封装:在浏览器环境提供空实现或模拟行为,在 Electron 环境调用 window.electronAPI
  • 保证前端在浏览器中也能正常运行,便于测试与演示

CI/CD 与发布策略

  • 构建矩阵:Windows、macOS arm64、macOS x64 三平台并行
  • 步骤:安装依赖、前端构建、版本更新、打包、绿色包、上传产物、发布
  • 产物:安装包与绿色包,按平台命名;发布到 GitHub Releases
sequenceDiagram
participant W as "Workflows"
participant N as "npm 脚本"
participant B as "electron-builder"
participant D as "dist 目录"
participant R as "GitHub Release"
W->>N : 执行 build-win/mac/mac-x64
N->>B : 生成安装包
B-->>D : 输出 exe/dmg/zip
W->>N : 执行 green 打包
N->>B : 生成 zip
B-->>D : 输出 zip
W->>R : 上传并发布

版本管理与自动更新机制

  • 版本来源:GitHub Tag(refs/tags/vX.Y.Z 或 refs/tags/X.Y.Z),由 update-version.js 读取并写回 package.json
  • 自动更新:当前仓库未见内置 autoUpdater 配置,若需在线更新可在 electron-builder 配置中启用 NSIS Web 或 Squirrel.Windows 更新通道,并在主进程引入 autoUpdater 逻辑

签名验证与 macOS 权限

  • macOS 签名:electron-builder 配置中可启用签名与公证流程(当前配置示例禁用签名算法,实际应按团队证书配置)
  • 权限与沙箱:entitlements.mac.plist 启用沙箱与用户文件夹读写权限,满足下载与草稿目录访问需求

依赖关系分析

  • 主进程依赖
    • Electron 核心 API(app、BrowserWindow、dialog、shell)
    • 预加载脚本与 IPC 处理器
    • NodeAPI 下载与日志模块
  • 打包与构建
    • electron-builder 与 electron-packager
    • Vite 前端构建,输出到 ui 目录
  • CI 依赖
    • GitHub Actions、nodejs 22、npm ci 缓存
graph LR
M["main.js"] --> P["preload.js"]
M --> I["ipcHandlers.js"]
I --> D["download.js"]
I --> L["logger.js"]
M --> B["electron-builder.config.js"]
M --> BG["electron-builder-green.config.js"]
B -.-> EB["electron-builder"]
EB -.-> OUT["dist 产物"]

性能考量

  • 窗口与渲染
    • 启用硬件加速、上下文隔离、禁用 Node 集成,降低安全风险并提升性能
  • 下载与 IO
    • 使用流式下载处理大文件,限制并发,增加重试与断点容错
    • 日志轮转与上限控制,避免磁盘占用过大
  • 打包体积
    • 使用 electron-builder 的 files 过滤,排除开发与临时文件
    • 绿色包显式包含运行所需资源,减少缺失导致的二次打包

故障排查指南

  • 权限错误(macOS)
    • 现象:未捕获异常弹窗提示权限不足
    • 处理:检查系统偏好设置 > 安全性与隐私 > 隐私 > 文件夹访问
  • 目录无读写权限
    • 现象:选择目录后仍提示权限不足
    • 处理:更换目录或授予对应文件夹读写权限
  • 下载失败
    • 现象:部分文件多次重试后失败
    • 处理:检查网络、URL 可达性、磁盘空间与目标目录权限
  • 安装包无法运行(macOS)
    • 现象:提示损坏或无法打开
    • 处理:确认签名与公证流程、Gatekeeper 放行、entitlements 配置正确

结论

本指南梳理了 capcut-mate 桌面客户端的构建与部署全流程,明确了脚本职责、打包配置、CI 策略与版本管理方式。结合 macOS 权限与沙箱配置、下载与日志模块、以及前端跨环境兼容封装,可稳定产出 Windows 与 macOS 平台的安装包与绿色包,并通过 GitHub Release 进行分发。后续可按需接入自动更新与签名公证流程,进一步完善发布体验。

附录

  • 开发环境配置
    • 安装 Node.js 22 与 npm ci,分别安装 desktop-client 与 web 子目录依赖
    • 使用 npm run start 启动主进程,npm run web:dev 启动前端开发服务器
  • 调试工具
    • 开发模式下自动打开 DevTools,日志输出到用户数据目录下的日志文件
  • 生产环境部署最佳实践
    • 使用 electron-builder 生成安装包并上传至发布渠道
    • 为 macOS 配置签名与公证,确保 Gatekeeper 放行
    • 为 Windows 配置代码签名,提升用户信任度
    • 使用绿色包提供便携分发选项,降低安装门槛

开源仓库: capcut-mate