实战:Electron + PWA 双端方案(2026)
一、背景
OrderPin Web POS 是一个多租户 SaaS 云端 POS 系统,同时需要覆盖桌面端和 Web 端两种交付形态。本文记录 2026 年视角下的双端部署方案。
- 一套代码在桌面端(Electron)和浏览器端(PWA)之间最大程度复用
- 桌面端需要访问打印机、钱箱等本地硬件
- 浏览器端也希望能直接驱动硬件,降低对 Electron 的依赖
- 未登录/网络不稳定时,收银操作不能中断
二、方案选型:Electron 降级为保底方案
到 2026 年,浏览器硬件 API(WebUSB、WebSerial、WebHID、WebBluetooth)已经足够成熟,绝大多数 POS 外设可以直接从浏览器驱动。因此我们采用分层策略:
1 | PWA(首选)← WebUSB/WebSerial → 打印机/钱箱 |
两种方案共用同一套 src/ 渲染进程代码。差异只在于硬件交互层:
| 维度 | PWA 方案 | Electron 方案 |
|---|---|---|
| 打印机 | WebUSB / WebSerial | IPC → main process → Node.js 驱动 |
| 钱箱 | WebUSB | IPC → main process → Node.js 驱动 |
| 条码扫描枪 | WebHID | IPC |
| 安装 | 添加到主屏幕(零成本) | NSIS 安装包(~80MB) |
| 离线能力 | Service Worker + IndexedDB + Background Sync | 同左,加上本地文件系统 |
项目结构(双端共用)
1 | web-pos/ |
硬件抽象层核心逻辑
1 | // src/hardware/index.ts |
PWA 端通过浏览器硬件 API 驱动的场景,完全不需要安装 Electron。据统计约 90% 的客户仅使用 PWA 就满足了需求。
三、Electron 配置(electron-vite)
虽然 Electron 现在是保底方案,但仍然需要维护。使用最新的 electron-vite,配置简洁:
1 | // electron/electron.vite.config.ts |
四、主进程核心(IPC + 硬件回退)
Electron 主进程主要服务于那些 WebUSB/WebSerial 不兼容的老旧硬件:
1 | // electron/main/index.ts |
五、预加载脚本(安全的 API 暴露)
1 | // electron/preload/index.ts |
六、PWA 离线架构
PWA 端的离线能力由 Service Worker + IndexedDB 提供:
1 | // public/sw.js(简化) |
七、总结
2026 年的双端部署方案与 2022 年最大的区别是:Electron 从必需品降级为保底方案。浏览器硬件 API 的成熟让 PWA 能覆盖绝大多数 POS 外设场景,Electron 只作为老旧设备的兼容层存在。整套方案的代码复用率从 95% 进一步提升到 99%——硬件交互层以内的代码完全一致,差异只在于硬件驱动的实现策略。