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

发布时间:2026/9/3 6:56:40

一个 Electron + Deno + Chromium 的桌面应用,是怎么把三套运行时塞进安装包的
桌面 RPA 有一个大部分 Electron 应用不会遇到的问题除了应用本身它还得把执行引擎和浏览器内核一起分发给用户。作为一个开源免费 RPA 项目FreeRPAhttps://github.com/freerpa/freerpa的打包配置就是围绕这个问题展开的——它在 electron-builder.yml 和几个 scripts 里把三套运行时和一个原生数据库模块安排得比较清楚。这篇就记录它的分发策略以及背后的工程原因。一、先看它要分发哪些东西一个 RPA 客户端运行起来需要的东西比普通应用多Electron 应用壳主进程 渲染进程代码Vue 3 那套Deno 运行时执行引擎的宿主作为独立二进制随包分发Worker 运行时资源节点执行器、引擎源码、依赖闭包Chromium 浏览器内核指纹浏览器内核随包内置sqlite3 原生模块N-API 二进制本地数据层依赖。难点在于这些组件对打包进 asar 还是放 asar 外的诉求完全不同。二、三个分发区asar / asarUnpack / extraResourceselectron-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/deno→denoDeno 二进制resources/worker→workerworker 运行时资源filter 排除了 node_modulesresources/worker/node_modules→worker/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解决得很幂等先用fs.realpathSync解析真实安装路径——因为 yarn 的.deno隔离布局下node_modules/sqlite3是个符号链接不解析真实路径会找错地方检查build/Release/node_sqlite3.node是否存在存在就跳过幂等缺失才跑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/Vn/execute.js含同目录相对依赖node_modules/**deno cache 预填充的依赖闭包version.json。关键点是import mapdeno 的模块解析依赖import-map.json把裸模块名映射到闭包路径生产布局靠它才能解析节点里的 npm 依赖。构建脚本还区分了 dev / prod--dev只复制源码、跳过 deno cache开发时直接用项目根 node_modules——这样开发迭代快产物不脏。五、浏览器内核按平台分发只打包当前平台Chromium 内核体积大不能每个平台都塞一遍。electron-builder.yml 里 Windows、macOS、Linux 各自的extraResources只打包当前平台的目录winbrowser/win32→browser/win32macbrowser/darwin→browser/darwinlinuxbrowser/linux→browser/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 。

相关新闻

移频干扰仿真:Matlab建模固定频率牵引的工程实践

移频干扰仿真:Matlab建模固定频率牵引的工程实践

2026/9/3 6:56:40

简介:本资源是一份面向信号处理初学者与MATLAB实践者的轻量级技术实现包,聚焦于固定频率灵巧噪声仪的移频干扰建模与仿真,解决通信抗干扰测试、噪声源动态特性分析等典型工程问题。压缩包共3个文件(1个核心MATLAB脚本、1个说明文本…

Oracle 11gR2 11.2.0.4 Linux安装深度指南:依赖、分卷与静默部署

Oracle 11gR2 11.2.0.4 Linux安装深度指南:依赖、分卷与静默部署

2026/9/3 6:56:40

/* 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:46:39

一、行业通用技术架构:一体两翼三层具身智能之所以成为当前人工智能和机器人领域最受关注的方向之一,并不是因为它单独代表了某一种新算法,而是因为它试图解决一个更完整的问题:如何让智能系统真正进入物理世界,感知环…

Python+Selenium+ddddocr实现校园讲座全自动预约脚本

Python+Selenium+ddddocr实现校园讲座全自动预约脚本

2026/9/3 7:56:42

简介:本资源是一套面向东南大学在校学生及Python自动化初学者的讲座抢票实战工具,专为解决人文与科学素养系列讲座预约中验证码识别难、短信认证繁琐、跨校区优先级混乱等高频痛点而设计。脚本基于PythonSelenium构建,集成ddddocr实现图形验证…

UDP Flood原理、压力测试与防御实战指南

UDP Flood原理、压力测试与防御实战指南

2026/9/3 7:56:42

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

SpringBoot+Vue宠物咖啡馆系统设计与实战

SpringBoot+Vue宠物咖啡馆系统设计与实战

2026/9/3 7:56:42

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

SpringBoot考务管理系统:从架构设计到高并发实战

SpringBoot考务管理系统:从架构设计到高并发实战

2026/9/3 7:56:42

简介:本资源是一个基于SpringBoot开发的考务管理系统完整工程包,面向Java后端开发者及高校教育信息化项目实践者,旨在解决学校考试全流程数字化管理难题,涵盖考生、考场、试题、成绩与权限等核心业务场景。压缩包共174个文件&…

校园管理系统源码全解析:从SpringBoot架构到二次开发实战

校园管理系统源码全解析:从SpringBoot架构到二次开发实战

2026/9/3 7:56:42

简介:这是一套面向计算机专业本科生毕业设计与Java全栈开发学习者的校园管理系统完整源码,覆盖学生管理、课程安排、成绩录入、教师信息、考勤统计等核心教育业务场景,支持Web端、Android客户端及微信小程序三端协同,助力开发者掌…

华三华为锐捷迈普中兴交换机二三层接口切换命令

华三华为锐捷迈普中兴交换机二三层接口切换命令

2026/9/3 7:46:42

一 华三交换机1.交换接口切换为路由接口interface GigabitEthernet 1/0/24 port link-mode route # 切换为三层路由接口 ip address 192.168.100.2 242.路由接口切换为交换接口#vlan 100interface GigabitEthernet 1/0/24port link-mode bridge # 切换为交换接口 port lin…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/9/2 10:08:07

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/9/2 12:11:52

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/9/1 23:49:08

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

【原创】基于微信小程序+AI大模型+uni-app的宠物用品商城小程序(设计与实现)

【原创】基于微信小程序+AI大模型+uni-app的宠物用品商城小程序(设计与实现)

2026/9/3 0:06:18

摘要:随着电子商务与本地生活服务的普及,线上交易与店铺运营管理已成为常规业态。传统分散式进销存与人工对账方式存在流程割裂、库存难同步、促销规则难落地、经营数据难沉淀等弊端,难以支撑一体化的数字化运营。同类课题亦多见多商户在线商…

【原创】基于AI大模型+SpringBoot+Vue的宠物用品商城(设计与实现)

【原创】基于AI大模型+SpringBoot+Vue的宠物用品商城(设计与实现)

2026/9/3 0:06:18

摘要:随着电子商务与本地生活服务的普及,线上交易与店铺运营管理已成为常规业态。传统分散式进销存与人工对账方式存在流程割裂、库存难同步、促销规则难落地、经营数据难沉淀等弊端,难以支撑一体化的数字化运营。同类课题亦多见多商户在线商…

【原创】基于微信小程序+AI大模型+uni-app的节日礼品定制商城小程序(设计与实现)

【原创】基于微信小程序+AI大模型+uni-app的节日礼品定制商城小程序(设计与实现)

2026/9/3 0:06:18

摘要:随着电子商务与本地生活服务的普及,线上交易与店铺运营管理已成为常规业态。传统分散式进销存与人工对账方式存在流程割裂、库存难同步、促销规则难落地、经营数据难沉淀等弊端,难以支撑一体化的数字化运营。同类课题亦多见多商户在线商…

远程协作的工作台整理

远程协作的工作台整理

2026/9/3 6:56:24

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/3 6:39:45

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/3 5:20:28

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…