news 2026/9/3 6:56:19

一个 Electron + Deno + Chromium 的桌面应用,是怎么把三套运行时塞进安装包的

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一个 Electron + Deno + Chromium 的桌面应用,是怎么把三套运行时塞进安装包的

桌面 RPA 有一个大部分 Electron 应用不会遇到的问题:除了应用本身,它还得把执行引擎浏览器内核一起分发给用户。作为一个开源免费 RPA 项目,FreeRPA(https://github.com/freerpa/freerpa)的打包配置就是围绕这个问题展开的——它在 electron-builder.yml 和几个 scripts 里,把三套运行时和一个原生数据库模块安排得比较清楚。这篇就记录它的分发策略,以及背后的工程原因。

一、先看它要分发哪些东西

一个 RPA 客户端运行起来,需要的东西比普通应用多:

  • Electron 应用壳(主进程 + 渲染进程代码,Vue 3 那套);
  • Deno 运行时(执行引擎的宿主,作为独立二进制随包分发);
  • Worker 运行时资源(节点执行器、引擎源码、依赖闭包);
  • Chromium 浏览器内核(指纹浏览器内核,随包内置);
  • sqlite3 原生模块(N-API 二进制,本地数据层依赖)。

难点在于:这些组件对"打包进 asar 还是放 asar 外"的诉求完全不同。

二、三个分发区:asar / asarUnpack / extraResources

electron-builder 提供了三种"放东西的地方",FreeRPA 对它们的使用很有代表性:

1. asar(应用代码)

files里把src/*scripts/**resources/**browser/**全排除——应用代码只进 asar,其他东西按各自的方式走,避免重复打包。注释里写得很直白:浏览器内核只经 extraResources 按平台单独分发,防止重复打进 asar 导致包体膨胀。

2. asarUnpack(保留在 asar 外的原生二进制)

esbuild平台原生二进制asarUnpack。原因很具体:asar 是只读虚拟文件系统,无法 spawn 里面的可执行文件——如果不 unpack,打包插件功能会报spawn ENOTDIR(开发环境下 node_modules 是实体文件所以正常,打包后 asar 化才暴露)。这类"开发正常、打包炸"的问题,是打包工程里最值得写注释的地方,这个文件里就写清楚了。

3. extraResources(完整的外部资源)

三样大件都走这里:

  • resources/denodeno:Deno 二进制;
  • resources/workerworker:worker 运行时资源,filter 排除了 node_modules
  • resources/worker/node_modulesworker/node_modules:依赖闭包单独显式复制

第三行的存在很关键。worker 的依赖闭包是 deno cache 预填充生成的,目录布局已经实体化,如果不单独复制,运行时无法解析节点依赖——这是比"漏文件"更难排查的问题,所以它宁可拆成两条 extraResources 规则,也要保证依赖闭包一定在。

三、原生依赖:sqlite3 的 N-API 问题

sqlite3 是 N-API 模块,二进制靠prebuild-install下载(或 node-gyp 本地编译)。网络失败时node_sqlite3.node缺失,打包产物里就没有它,运行时直接报 “Could not locate the bindings file”。

ensure-native.mjs解决得很幂等:

  1. 先用fs.realpathSync解析真实安装路径——因为 yarn 的.deno隔离布局下,node_modules/sqlite3是个符号链接,不解析真实路径会找错地方;
  2. 检查build/Release/node_sqlite3.node是否存在,存在就跳过(幂等);
  3. 缺失才跑prebuild-install,失败回退 node-gyp。

对应地,配置里npmRebuild: false——原生模块的构建不交给 electron-builder 默认流程,而是由这个脚本在打包前置阶段统一保证,避免两套机制互相打架。

四、worker 运行时:构建、而不是复制

worker 那部分不是简单把目录拷过去,而是有专门的构建脚本build-worker.mjs,产出到resources/worker/

  • worker 源码(host.js/engine.js/bridge.js/worker-common.js/data-bridge.js/electron-bridge.js/import-map.json/core/**);
  • 节点执行器(nodes/<type>/V<n>/execute.js,含同目录相对依赖);
  • node_modules/**:deno cache 预填充的依赖闭包;
  • version.json

关键点是import map:deno 的模块解析依赖import-map.json把裸模块名映射到闭包路径,生产布局靠它才能解析节点里的 npm 依赖。构建脚本还区分了 dev / prod:--dev只复制源码、跳过 deno cache,开发时直接用项目根 node_modules——这样开发迭代快,产物不脏。

五、浏览器内核:按平台分发,只打包当前平台

Chromium 内核体积大,不能每个平台都塞一遍。electron-builder.yml 里 Windows、macOS、Linux 各自的extraResources只打包当前平台的目录:

  • win:browser/win32browser/win32
  • mac:browser/darwinbrowser/darwin
  • linux:browser/linuxbrowser/linux

注释直接说明了意图:“内置浏览器内核:仅打包当前平台,随包分发无需下载”。这套"内置免费指纹浏览器内核随安装包走"的设计,从用户视角看就是免安装浏览器、开箱即用;从工程视角看,则是用 electron-builder 的按平台 extraResources 机制,把包体翻倍的问题挡在了配置层。

macOS 侧还配了 entitlements(沙盒权限声明)和相机/麦克风/文档目录的用途说明,notarize: false关闭了公证(本地分发场景的取舍);Windows 侧 NSIS 允许用户改安装目录;Linux 侧一次产出 AppImage / snap / deb 三个目标。

六、一条命令的构建流水线

最终打包不是散装的,package.json 里把步骤串成了一条流水线:

npm run ensure:native && npm run fetch:deno && npm run build:worker && npm run build

即:保证 sqlite3 原生二进制 → 下载当前平台 Deno → 构建 worker 运行时 → electron-vite 构建 → electron-builder 出包。前置步骤全部幂等,重复执行不会重复下载或重复构建。

小结

这个项目打包设计最值得借鉴的地方,是把"分发什么、放哪个区、为什么"用注释和脚本写得很清楚:asar 管代码、asarUnpack 管"必须在 asar 外还能执行"的二进制、extraResources 管大件外部资源,原生依赖用幂等脚本前置保证,worker 运行时用构建而非复制的方式产出,浏览器内核按平台分发。对要分发多运行时或原生依赖的跨平台桌面应用,这份配置本身就是一份不错的参考模板。源码在 https://github.com/freerpa/freerpa 。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 6:56:16

Python仿真轴承故障信号:从时域波形到频谱与包络谱分析实战

简介&#xff1a;本资源面向机械故障诊断、信号处理方向的本科生、研究生及工程技术人员&#xff0c;提供轴承典型故障&#xff08;如内圈、外圈、滚动体缺陷&#xff09;的仿真信号分析完整实践方案。资源包含时域波形图与频谱图的生成与可视化代码&#xff0c;辅以直观的操作…

作者头像 李华
网站建设 2026/9/3 6:56:06

Python计算器项目实战:从命令行到GUI的完整开发指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/3 6:55:44

从零构建草莓成熟度检测数据集:YOLOv8实战与农业视觉应用

简介&#xff1a;本资源是面向农业AI研发者、计算机视觉初学者及高校科研团队的草莓成熟度目标检测专用数据集&#xff0c;聚焦自动化采摘与生长监测中的核心难点&#xff1a;红色果实与复杂背景的区分、成熟度过渡模糊、小目标密集遮挡等实际问题。数据集包含530张田间高分辨率…

作者头像 李华
网站建设 2026/9/3 6:55:28

继电保护屏幕视觉识别数据集:700张VOC标注工业图像

简介&#xff1a;本资源是面向电力系统智能化研发人员、计算机视觉算法工程师及高校电力AI方向研究者的变电站继电保护控制柜屏幕检测专用图像数据集&#xff0c;旨在支撑屏幕区域定位、仪表读数识别、告警灯状态判别等关键任务的模型训练与验证。数据集共700张高质量现场采集图…

作者头像 李华
网站建设 2026/9/3 6:53:35

合成烃冷却液长期浸泡:材料兼容性数据才是选型分水岭

引言合成烃冷却液在数据中心浸没式液冷中的用量逐年上升&#xff0c;但行业里"宣传页参数漂亮、长期运行对不上"的案例并不少见。本文结合公开测试方法和行业案例&#xff0c;拆解合成烃冷却液长期浸泡后真正需要关注的四个数据维度&#xff0c;供选型参考。一、短周…

作者头像 李华
网站建设 2026/9/3 6:52:58

AI大模型赋能医疗:小白也能入行的收藏必备职业新赛道!

AI大模型已在北京儿童医院眼科成功应用&#xff0c;实现秒级眼底照片分析&#xff0c;并拓展至糖尿病、高血压等疾病的早期风险识别。全国600家三甲医院及3000多家医疗机构已落地该系统。未来&#xff0c;既懂AI又懂医药的复合型人才缺口达250万&#xff0c;年薪可达60万至100万…

作者头像 李华