首页 / 资讯中心 / 文章详情

从仓库管理到AGV上位机:目标平台与桌面技术栈选型复盘

从仓库管理到AGV上位机:目标平台与桌面技术栈选型复盘 ★ FEATURED ARTICLE
拿到一个新项目第一步往往不是写代码而是先回答一个问题这东西到底跑在哪目标平台怎么定技术栈怎么选直接决定了后面一个季度是顺风顺水还是天天填坑。这篇内容我就拿自己做过的仓库管理桌面工具来复盘从最初一页纸需求到圈定 Windows 工位机再到确定 Electron 技术栈中间做过横向对比、踩过打包和安全方面的坑也顺手把 AGV 上位机这类二进制关联度很高的工业场景技术栈理了一遍。适合正在做桌面应用、工业上位机或者纠结 Electron 与 Tauri 到底选谁的朋友参考。1. 目标平台先搞清软件要活在什么环境里1.1 什么是目标平台为什么它比功能优先级更高很多人把“目标平台”理解成“我打算支持哪些操作系统”比如 Windows、macOS、Linux、iOS、Android 各来一个。我做了几年项目之后发现这个理解太乐观了。目标平台不是你的愿望清单而是产品真实运行的环境集合它包括操作系统、硬件性能、屏幕尺寸、网络条件、外设型号甚至包括现场有没有人会给这台机器打补丁。需求方经常说“随便什么系统能跑就行”这句话听起来很开放实际上是把最复杂的兼容性决策丢给了你。做技术的人必须把它翻译成可验证的边界条件。比如说我们那个仓库项目一开始需求文档里写的也是“最好 Web 打开就能用”我去现场转了一圈之后发现仓库里全是 Windows 工控机内存 4G没有外网管理员装了 USB 扫码枪IT 部门能远程协助但不会在 Linux 上运维。这一圈走下来“Web 优先”的思路直接就被否掉了因为现场根本没有一台可以作为 Web 服务器的机器浏览器访问本地静态页面还要绕开浏览器安全策略USB 扫码枪在网页里的兼容性更是一言难尽。目标平台从来不只是技术参数它背后是一个完整的用户使用场景。你在选型之前必须把自己从“开发者”切换成“使用者的邻居”去看看那个人每天是怎么开机、怎么点鼠标、怎么遇到问题、怎么骂人的。1.2 用四个维度把平台边界画清楚我习惯用一个四维清单来圈定目标平台使用场景、系统环境、硬件性能、网络与部署。下面是我们当时在仓库项目里填完的实际结果你可以直接照着抄维度要回答的问题当时现场得到的答案使用场景用户是固定坐在工位前还是拿着设备到处走固定工位为主偶尔用 PDA 扫码主操作界面是台式机系统环境主流操作系统和版本有没有办法升级Windows 10 为主还有少量 Win7无计划统一升级硬件性能CPU、内存、屏幕、外设分别是什么档次4G 内存、无独显、屏幕 1200x900必须支持 USB 扫码枪网络与部署公网还是内网能否访问外网包管理器谁来运维仓库内网连不到公网源IT 只会帮忙装 exe 安装包填完这个表之后很多事立刻变清楚了。比如公网源不可用意味着 Tauri 构建时如果要从 crates.io 拉取 Rust 依赖就会非常痛苦内存只有 4G意味着任何跑起来就要占 1G 的技术栈都会让现场劝退支持 USB 扫码枪意味着应用必须能直接访问串口设备纯 Web 方案基本出局。这个表不是填着玩的后面所有技术栈的评分都基于它。有人会问如果这个项目是要做一个面向公众的 App 呢那四个维度照样适用只是答案会变成“iOS 和 Android 双端、手机型号区间、弱网环境占比、应用商店分发”。核心逻辑是一样的先搞清楚环境再谈技术。1.3 为什么最终是“Windows 桌面为主、macOS 仅限研发自用”先说我最后得出的结论桌面主交付目标锁定 WindowsmacOS 只作为团队开发机Linux 桌面直接不做移动端单独做一个轻量的 PWA 扫码页不放进桌面验收范围。这个决策看起来保守但每一刀都有理由。Web 端被否掉不是因为它技术不行而是仓库现场的部署环境根本不具备服务器条件内网穿透的优先级在客户眼里排在所有功能之后浏览器访问本地资源和 USB 外设的权限模型始终绕不过去。Linux 桌面被延迟则是因为现场没有任何一台 Linux 设备也没有对应运维能力做了等于做一个没人能安装的版本。macOS 就更简单了它不在客户资产列表里。保留 PWA 扫码页是觉得 PDA 场景确实存在但需求很小不值得为此把主项目做成跨三端的架构。用一个独立可访问的移动网页扫个码、看一眼数据就够了。我始终记着一句话平台选择要按部署环境和用户操作特征来不是按开发者的技术偏好来。你要是喜欢 Rust、喜欢 Swift那你自己玩可以别拿客户的项目当试验田。2. Electron 技术栈解剖三层结构、核心组成与真实代价2.1 Electron 为什么是桌面端选型的“最大公约数”Electron 技术栈网上搜出来一大片核心其实就一句话Electron Chromium 渲染层 Node.js 主进程 系统原生能力封装。Chromium 负责画页面Node.js 负责操作系统资源两者加在一起让前端团队能用 HTML、CSS、JavaScript 写一个原生壳桌面应用同时还能调用文件系统、串口、托盘、自动更新这些“桌面才有”的能力。对很多从 Web 转过来的团队来说这是学习成本最低的路线。Electron 应用内部有三个角色我用一个生活化类比解释主进程是项目的后台经理负责开窗口、关窗口、跟操作系统打交道渲染进程就是你看到的那个窗口页面负责界面展示预加载脚本是经理授权的传话员只把批准过的能力递给页面避免页面直接摸到操作系统底牌。安全模型的核心是渲染进程里不要开启 nodeIntegration页面能调什么、不能调什么由 preload 脚本说了算。下面是一个仓库工具项目里最常见的 Electron 技术栈组合层次选型理由渲染框架Vue 3 TypeScript团队前端背景Vue 的上手曲线和生态最稳妥构建工具electron-vite主进程、preload、渲染进程三层统一构建开发时热更新体验好界面组件Element Plus中后台场景下表格、表单、弹窗组件齐全开发效率高进程通信contextBridge ipcRenderer / ipcMain安全模型清晰避免页面直接拿 Node 权限本地数据SQLite better-sqlite3数据量稍大或需要查询时结构化 SQLite 最靠谱简单配置electron-store少量键值配置JSON 文件存储够用打包分发electron-builder electron-updater支持 NSIS/MSI、自动更新社区资料丰富日志与排查electron-log 崩溃采集现场黑盒出了问题能回溯安全加固session 权限隔离、CSP、禁用 nodeIntegration桌面应用同样会面对注入风险2.2 不选 Tauri、Flutter Desktop、PySide6 的原因选型过程中我把市面几套主流方案做了横向对比最后拍板用 Electron。不是因为 Electron 最好而是它在这个场景下最合适。方案包体大小内存占用跨平台生态成熟度团队门槛适合场景Electron大80-150MB较高优极高低前端即可复杂交互、Web 生态复用、交付周期紧Tauri小3-10MB低优中等需要 Rust 能力轻量工具、安全要求高、团队有余力Flutter Desktop中等中等尚可中等需 Dart移动端与桌面端 UI 统一PySide6 / Qt中等中等优高需 Python / C工业上位机、硬件强关联老实说Tauri 在打分里一度很靠前包体小、内存低、安全性也更好。但结合我们的仓库场景问题出在两点一是现场无法访问公网源Rust 依赖拉取会变成灾难二是团队当时三个人全是前端背景没有一个人能保证 Rust 侧出问题时兜底。这不是 Tauri 不行而是条件不允许。Flutter Desktop 的问题是 UI 组件风格偏移动端我要做的是表格密集型中后台它的长表格性能调优资料远不如 Web 生态丰富。PySide6 在工业场景很强但让前端团队临时转 Python 写界面进度风险立刻翻倍。所以我的结论是选技术栈不是选“最强的”是选“当前约束下综合风险最低的”。任何脱离了团队能力和现场环境的选型对比都只是 PPT。2.3 Electron 的代价和缓解手段Electron 被吐槽最多的是两件事包体大、内存高。我先把它说得难听点默认安装包随随便便 150MB内存占用三四百MB 是日常你要是开多个窗口每一个都是一个独立渲染进程。这是 Chromium 多进程架构决定的没法像 Qt 那样一个进程画一堆窗体。但这些问题不是不能缓解。包体大可以在打包时做三件事压缩 asar、用 electron-builder 的 files 配置只保留运行所需文件、按平台分发而不是一个大而全的包。内存高可以从业务侧控制限制窗口数量、长列表用虚拟滚动、避免全局事件监听堆积、生产环境关闭所有 console 输出。我特别强调 console 输出这条因为它看起来不起眼实际上在长时间运行的应用里会造成明显的内存缓慢上涨我们压测 48 小时的时候亲测踩到。还有一个容易被忽略的成本是 Electron 的升级频率。Chromium 和 Node 的版本迭代快Electron 每几个月就出一个新主版本安全修复也会跟着来。我的做法是每半年主动跟一次稳定版本不追新也不拖到完全不能再用的地步。桌面应用不像网页那样可以静默更新升级策略不提前规划后期就是定时炸弹。3. 延伸案例AGV 上位机与调度系统的技术栈3.1 为什么单独聊 AGV 技术栈“agv技术栈有哪些”这个词我确实见过很多人在搜。AGV也就是自动导引车项目选型思路跟普通管理系统完全不一样。很多人以为 AGV 项目就是写个页面展示小车位置把技术栈按 Web 项目那套选结果一到现场就被通信协议、断线重连、调度算法这些硬骨头砸懵。一个完整的 AGV 系统大概分三层车体层包含机械结构、电池、电机驱动器车载控制器层通常用 PLC、嵌入式 Linux 或 ROS2负责电机控制、传感器采集和最基本的安全逻辑调度系统层负责任务分配、路径规划、避障和交通管制一般是一台独立的调度服务器最后才是上位机监控层也就是给人看的那块屏幕。大多数人讨论“AGV 技术栈”时实际讨论的是上位机监控和调度系统这一层。3.2 AGV 上位机监控技术栈怎么选上位机监控的典型需求包括地图实时显示车辆位置、车辆状态面板、任务下发与取消、历史轨迹回放、报警弹窗。这些需求有一个共性界面多、数据更新快、需要长连接、需要离线和弱网容错。可选方案无非这么几条路。传统工控行业用 Qt/C 或组态软件稳定性高但界面开发效率低前端工程师上手成本极高工业组态软件胜在成熟可是授权费不便宜定制化还别扭用 Unity/UE 做 3D 数字孪生视觉上很酷可是对现场工控机的显卡要求很现实稍老一点的机器直接拉胯。我自己实际会推荐 Electron WebSocket/MQTT Canvas 地图渲染的组合。Electron 在界面上能复用 Web 生态画地图、做动画、做表格都顺手同时又能通过 Node 侧直接对接串口和底层 Socket算是一个平衡点。具体组合可以这样搭界面层用 Vue3 TypeScript地图渲染不要一上来就上 3D 大场景先用 Canvas 2D 加自绘元素需要底图再用静态瓦片或 SVG 拼接通信层用 WebSocket 接调度服务MQTT 留着做多设备消息广播本地历史数据落 SQLite回放和报表直接用 SQL 查日志用 electron-log崩溃现场必须能还原。3.3 AGV 调度通信协议选型参考AGV 项目里最容易被轻视的是通信层。地图画得再好看通信协议一不稳定现场就直接骂娘。我整理了一张常用通信方式的适用对照表通信方式适用场景重点关注Modbus RTU/TCPPLC、驱动器直连寄存器映射、轮询周期、字节序TCP 自定义报文车辆与调度主站的数据链路粘包拆包、心跳超时、报文序号确认OPC UA与 MES 或组态软件集成证书配置、命名空间处理MQTT多设备、弱网、微服务解耦QoS 等级、遗嘱消息、干净会话WebSocket浏览器、桌面端实时数据展示断线重连退避、心跳、消息压缩做 AGV 调度我有一个很深的体会最难的不是把车辆状态“显示出来”而是保证一万次通信里哪怕一次报文错位系统也能自己恢复。所以通信设计一定要有几道防线发送端序列号、接收端超时重发、状态机合法迁移限制、异常时车辆主动减速停车。3.4 AGV 上位机容易踩的三个泥坑泥坑一是过度追求视觉表现。有些项目上来就要 3D 车模、要实时光照结果调试了一个月调度数据全量推送导致页面卡死。工业项目里数据正确性和系统的可恢复性永远排在视觉效果前面。泥坑二是把车辆状态刷新写成了全量轮询。每 500ms 一次下拉全量车辆列表车辆一多服务器和网络同时被拖垮。正确做法是订阅式推送加增量更新界面只改变化的部分。泥坑三是无视现场硬件。普通办公电脑可能集显都没有WebGL 一个上下文创建失败就直接白屏。所以我在上位机方案里坚持用 Canvas 2D 而不是 WebGL除非明确知道现场有独立显卡否则绝不为视觉效果冒险。4. 实操复盘我从零确定技术栈的六个步骤4.1 步骤一把“都能跑”翻译成硬性约束很多需求方嘴上说“都能跑”心里想的是“你帮我搞定所有情况”。我的做法是直接丢一张约束清单过去操作系统位数和版本、内存上限、是否离线、是否有外设、是否需要管理员权限安装、网络出口策略是什么。现场表单填回来后我把约束逐条写进项目文档。当时仓库场景的答案是Win10 64 位、4G 内存、USB 扫码枪、无外网、无管理员权限安装、IT 可以远程协助。这些看起来都是零碎信息却是选型的地基。比如“无管理员权限安装”直接否掉了那些必须装系统服务和开机自启程序的技术栈“4G 内存”又逼着我放弃所有需要跑 Java 虚拟机的方案。这个步骤没有技术含量但它是后面所有决策的第一步。4.2 步骤二做选型评估矩阵把候选方案排成矩阵按约束满足度、开发效率、团队技术匹配、第三方库生态、维护成本、交付风险六个维度打分。我不建议把这个过程搞成严格的数学题因为分数本身带主观性但它能逼你把每一条优缺点都落到纸面上。我给这次的候选方案打了个印象分Electron 在开发效率和团队匹配上几乎满分唯一的问题是包体大和内存高Tauri 在约束满足度上因为离线依赖问题失分而且 Rust 无人兜底PySide6 在设备对接上很强但前端团队转换成本太高。最终 Electron 以综合分最高胜出这个结果其实在打分前我心里已有答案但打分的过程让团队所有人都能看见理由后面的决策阻力就小得多。4.3 步骤三最小原型验证打分只是纸上谈兵真正让我放心的是先做了三个最小原型Electron Vue3 Vite纯 Web Vue3PySide6。每个原型的验证点完全不同。Electron 要验证 USB 扫码枪能不能在 node-serialport 下直接识别、打包出来的 exe 能否在 4G 内存 Win10 上流畅运行。纯 Web 要验证扫码枪绕不绕得过浏览器安全策略。PySide6 要验证表格组件和界面开发效率。测试结果很直接Electron 原型在半天内就串通了扫码枪读取、界面渲染、本地 SQLite 落库冷启动大约 2 秒内存稳定在 250MB 上下纯 Web 在扫码枪这关就卡住了只能在浏览器里走手动输入PySide6 做表格效率低到让我怀疑人生光是一个树形表格就折腾了大半天。三组测试一做团队内部没有任何异议所有人都认可 Electron。4.4 步骤四通信与稳定性压测选型不能只做功能演示还得看能不能在恶劣条件下持续运行。我写了一个模拟脚本向本地 IPC 接口持续推送 200 个模拟设备心跳连续跑 48 小时同时记录内存和 CPU。Electron 主进程在这个压力下很稳内存维持在 250MB 上下没有崩溃。但压测也暴露了一个隐患只要开着控制台或者日志输出没有关闭内存就以可观察的速度缓慢上涨。原因是渲染进程大量 console.log 产生的字符串被保留在上下文里。这让我在项目启动前就定了规矩生产环境的日志一律走文件输出界面不打印任何 console 内容。这条不起眼的纪律在后期现场部署时省了不少事。4.5 步骤五部署与升级方案确认开发环境再顺利部署环节拉胯一样完蛋。我们用 electron-builder 产出 NSIS 安装包内网分发。自动更新这一环比较特殊因为现场没有外网我就在本地文件服务放了一个 update.ymlElectron 启动时检查版本号下载更新包再重启。验证过程里碰到过版本号没递增导致永远提示最新版的问题也碰到过服务器证书不被信任导致下载失败的问题。后面统一约定每次发布必须递增版本号且同一次变更同步更新 update.yml服务器一律过一遍证书校验。这样笨拙但可靠的流程比任何花哨的自动更新方案都稳。4.6 步骤六把选型理由写进项目文档这步最容易被跳过但我觉得它最值得做。项目文档里明确记下候选方案有哪些、各自优劣势、我们做了哪些验证、最后选了谁、遗留了什么风险。三个月后如果有新同事质疑“为什么不换 Tauri”直接指给他看这份文档比再去翻聊天记录靠谱得多。风险记录也要写清楚我当时写了三条包体偏大接受中高内存占用通过限制数据量控制Rust 能力缺失后续如果要做高性能模块单独评估 Husky 或者 Tauri 插件。这些风险没有阻止我们上线但让后面的维护者知道边界在哪。5. 常见问题与避坑速查5.1 Electron 内存偏高怎么处理现象常见原因处理思路内存缓慢上涨console 输出堆积、全局监听未清理生产环境关闭控制台日志移除 window 和定时器监听打开多个窗口后内存升高Chromium 每窗口一个进程控制窗口数量弹窗尽量用单实例复用GPU 进程占用高显卡驱动兼容问题app.disableHardwareAcceleration() 禁用硬件加速页面长时间挂着不动缓存和历史记录堆积定时清理无用的 BrowserView限制列表数据量遇到内存问题先用任务管理器量化不要上来就怀疑框架。多数场景不是你遇见了什么玄学而是代码里养着定时器、事件监听、控制台日志这些隐性吸血鬼。5.2 打包与安全避坑未签名的 exe 在不少杀毒软件里会被直接拦掉这是 Electron 应用最容易挨黑的一刀。解决办法是买代码签名证书至少也要用自签名证书加上安装时的免责说明但正规交付还是建议花钱签。另一点是 asar 包虽然起到整合作用但它不等于加密核心算法逻辑不要指望它保密。安全性上再次强调nodeIntegration 必须关闭渲染进程的权限通过 preload 的白名单方式暴露页面里加 CSP 头尽可能缩小攻击面。5.3 跨平台路径和设备访问坑路径分隔符是跨平台第一坑。Windows 反斜杠和 POSIX 斜杠混着用一到另一台机器就爆。解决方案没有技术含量就是统一 path.join。设备访问这块串口、扫码枪、U 盘识别尽量都封装在主进程通过 IPC 暴露给界面层不要在渲染进程里轮询设备列表。USB 驱动不识别时优先检查 node-serialport 的底层依赖版本必要时本地重编译。5.4 现场部署三条铁律第一先确认用户现场的杀毒软件名单把安装目录提前放进白名单。第二安装包必须有签名内部环境至少要有一张正式证书。第三永远保留一键回滚机制旧版本目录和回滚脚本要躺在每台机器上。这三条看着基础但实际上每一个都能在关键时刻救人一命。6. 写在最后的一点私人体会我做完这轮选型之后最大的变化是不再轻易迷信某个框架也不再轻易诋毁某个框架。题目拆到最后真正决定成败的不是技术栈本身而是你对目标平台那一张张现实约束的理解。下次再有人问这个项目用什么东西做我会先反问一句它到底要在哪台电脑上跑、由谁来维护、网络是什么样、有没有外设、允不允许装软件。这几个问题问清楚技术栈的答案往往自己就会浮出来。如果你也正在选型强烈建议把每个候选方案的验证过程和结论写进文档几个月后回看你会感谢当时的严谨。
阅读完成 · 觉得有帮助?
咨询建站