Electron 做跨境 ERP 桌面端:多窗口与常驻体验
商家要边看订单边改库存,桌面端比单页 Web 更适合并行作业。
跨境 ERP 除了 Web 后台,我补了 Electron 客户端:本地常驻、多窗口、系统通知与快捷键,适合客服长时间盯单、仓管边拣货边改库存。浏览器 Tab 切换成本低,但高频并行作业时,独立窗口、托盘常驻、静默打印仍然更贴近一线操作习惯。
多窗口分工
主窗口负责导航与列表;订单详情、打印预览、操作日志可拆成独立 BrowserWindow。子窗口关闭不应退出应用,主进程维护窗口注册表,避免「关详情把整店关掉」。窗口尺寸与位置可按角色持久化,二次打开恢复布局。
共享状态
登录态、店铺上下文、主题配置通过主进程或共享 Store 同步,禁止每个窗口各登一次。Token 刷新由主进程统一调度,子窗口只读当前会话,避免 refresh 竞态导致部分窗口掉线。切换店铺时广播事件,所有打开窗口同步刷新上下文。
与 Web 复用
业务 UI 复用同一套 React 组件与 API 层;Electron 层只包壳:自动更新、托盘菜单、本地通知、静默打印、文件导出。平台差异收敛到 electron-bridge 适配模块,业务代码不直接 require('electron'),便于 Storybook 与 Web 端共用测试。
打印与导出
跨境场景常见面单、拣货单批量打印。渲染进程生成 HTML/PDF,主进程调系统打印或指定打印机;失败时错误回传到 UI,并保留任务队列支持重试。大批量导出走主进程写文件,避免渲染进程内存暴涨。
更新与安全
自动更新必须签名校验,下载走 HTTPS,安装前验证 publisher。开发、预发、生产 update channel 分离。更新提示应允许「稍后」,但安全补丁可配置强制窗口,并展示变更摘要。
凭证存储
Access Token 放 safeStorage 或 OS Keychain,禁止明文塞 localStorage。崩溃日志可上报,订单收货人、电话等字段脱敏后再上传。远程调试入口生产包默认关闭。
离线与弱网
桌面端不等于离线 ERP,但应优雅处理断网:列表展示最后同步快照,明确标注「离线数据」;恢复连接后增量拉取,冲突时提示用户。避免离线状态下仍允许提交不可逆操作(如确认发货)。
系统托盘与通知
托盘菜单提供「显示主窗口、暂停通知、退出」;新订单、库存告警走系统通知,点击通知聚焦对应窗口并定位记录。通知风暴要有合并策略,避免大促期间每秒弹窗把操作员逼到关通知。
典型坑
- 每个窗口开独立 DevTools 导致内存泄漏:生产包关闭多余 debug 入口
- 深链接唤起多个实例:单实例锁 + 第二实例聚焦已有窗口
- 与 Web 版本功能漂移:共用 monorepo 包,CI 跑同一套 API 契约测试
- 静默打印失败无反馈:任务队列与错误 Toast 缺一不可
部署与权限
企业环境可能限制自动更新或打印机驱动。安装包提供离线更新通道;打印前检测默认打印机是否可用,不可用时引导用户选择设备,而不是抛出底层异常栈。
与 Web 的功能边界
桌面端优先承载「盯盘、打印、多窗对照」场景,复杂配置仍引导回 Web,避免两套 UI 长期双维护。Deep link 从 Web 唤起 Desktop 打开指定订单时,应校验登录态与店铺权限,防止链接被转发后越权查看。
桌面端不是「把网站套个壳」,而是把高频操作的路径再缩短一截——少一次找 Tab、少一次重新登录,大促夜里就是差别。
小结
桌面端价值在多窗口并行与常驻通知,但自动更新签名、Token 存储与崩溃日志脱敏必须同步到位。与 Web 功能边界要清晰,避免两套半成品。发版前用真实商家作业路径做一次长时间挂机验证。