Electron-vue asar 局部打包优化处理方案——绕开每次npm run build 超级慢的打包问题

背景

因为组员对于 Electron 打包过程存在比较迷糊的状态,且自己也没主动探索 Electron-vue 打包细节,导致每次打包过程都消耗 5-6 分钟的时间,在需要测试生产打包时,极其浪费时间,为此针对 Electron-vue 打包的几个环节进行拆解,来减少打包时间,提高开发效率。

什么叫局部打包?

  1. electron 可以分为多个模块

    1. 主进程运行的 node js 代码,虽然 webpack 提供了 target:"node"(node 同步引入模式),但是 electron 自身提供了一些 api,例如 shell,session 等对象都是不能轻易被混淆的,所以这里的 target:"electron-main"

    2. 其他的还有 target: electron-renderer,electron-preload, web,这些就够用了

  2. 因为 renderer,inject,preload 这些东西都是可以单独打包的,所以这些东西甚至可以用多 github 包管理器来管理都行,只要最后塞的位置准确即可,这样不同的源文件可以用不同的 webpack 版本来打包,例如 renderer 源码可以单独用 webpack5 来打包提高速度,或者使用 vite 也行

  3. asar 包是 electron 运行的核心包,electron-builder 把 dist 中的依赖(根据 package.json 中dependencies 参数打包的)全部整合在一个 node_modules 文件夹下,然后连同 dist 一起打包成了 asar 包

    1. node_modules 是可以不塞到 asar 包里的,这样 asar 包体很小,就可以在启动时很快加载,性能提升,目前还未解决该问题

  4. asar 包是纯 js 的,无论是 mac 还是 windows 都是通用的,所以代码快速调试时,更新 asar 包即可

  5. 以上就叫做局部打包,而不是等待整个 electron build 完毕,build 过程是一个很耗费时间的过程,通过局部打包可以将整个过程降低到 30s 以内(机器性能较好的情况下)

讲解视频

补充 asar 知识

Electron 安装包 asar 解压定位问题实战-优快云博客

关键步骤讲解

wadesk.unpacked 文件夹怎么来的?(雪凯问的)

是通过 package.json 中的 asar 解压命令解出来的,其中 wadesk.unpacked 是我随便起的,我这里是直接用了当前代码库自己 build 时的一个 asar,其实就是为了拿到 node_modules,猜测 AdsPower Global 是将 node_modules 复制到了 resources 目录下,然后 app.asar 包里夹了一个 node_modules 空壳文件夹,解压后,路径就是 \resources\app.asar.unpacked\node_modules,因为空文件夹,不会覆盖原 node_modules 内容,载入内存时就把这个位置也给载入进去了,所以就可以与主代码分离。

主渲独立打包的脚本,electron-vue 都给了

如果使用 webstorm,直接右键执行即可,如果使用 vscode,则运行 npm run pack:main,或者把后面的脚本直接粘贴到控制台执行都行,打出来的包位置就在 dist 那里,假如打的是 main.js,那就在 electron 下面,把 main.js 拷贝到 wadesk.unpacked/dist/electron 对应位置下,同时要搜索一下 main.js 是否有自己写的代码,避免打包失误,没有打成功,造成调试时间浪费

如果你会写脚本,可以自己写个 rebuild 脚本,把三个过程走一遍

运行 pack:asar 将代码重新打回去

打完后拷贝 app.asar 到你的 wadesk 软件安装(注意不是用户数据目录哈),重启 wadesk,代码就可以正常运行了

当你在使用 ElectronVue 3 打包后的应用程序启动时报错 `Unable to load preload script` 时,这通常意味着 Electron 无法找到或加载预加载脚本(preload.js)。这类问题可能由多种原因引起,包括路径设置不当、构建配置错误等。接下来我们将一步步排查并解决问题。 ### 可能的原因及解决办法 #### 1. 确认 Preload 文件位置和名称 首先检查你的项目结构以及 `preload.js` 是否确实存在于你指定的位置。默认情况下,Electron 应该能找到位于项目的 `electron/` 目录下的 `preload.js` 文件。确保这个文件存在并且没有拼写错误或其他异常情况。 #### 2. 更新主进程中的 WebPreferences 配置 确保你在主进程中正确设置了 `webPreferences.preload` 参数指向正确的路径。对于打包后的应用程序而言,应该使用 `__dirname` 来获取当前工作目录而不是绝对路径。以下是推荐的做法: ```javascript const path = require('path'); function createWindow() { const win = new BrowserWindow({ webPreferences: { preload: path.join(__dirname, 'electron', 'preload.js'), // 使用相对路径 contextIsolation: true, nodeIntegration: false } }); // ...其他窗口配置... } ``` **注意**: 如果你正在使用asar打包,则需要特别小心路径引用。因为 asar 包内的资源是压缩存储的,所以你需要通过特定的方式访问它。 #### 3. 使用 `asar.unpacked` 排除 Preload 文件 有时为了保证性能或者出于安全性考虑,我们可以选择不对 `preload.js` 进行 ASAR 压缩。为此可以在 `build` 配置中添加一个例外规则以保持此文件不解压状态: 编辑 `vue.config.js` 或者相应的构建配置文件,在里面加入类似这样的配置: ```javascript module.exports = { pluginOptions: { electronBuilder: { builderOptions: { files: [ '**/*', '!**/*.map', '!node_modules/**/*' ], extraResources: ['!electron/preload.js'], // 排除 preload.js 使其不被打包asar directories: { output: 'dist_electron' } } } } }; ``` 同时调整前面提到的 `webPreferences.preload` 路径为相对于解压目录的实际位置。 #### 4. 检查打包生成的路径 确保你提供的 preload.js 的路径与实际打包结果相匹配。可以通过查看打包好的发布版 (`release/win-unpacked`) 内部是否有预期的 preload 文件夹及其内容来验证这一点。如果不存在,请返回源码尝试重新构建整个项目。 #### 5. 清理缓存重建工程 有时候旧的缓存数据会造成意想不到的结果,清除 npm 缓存(`npm cache clean --force`) 并删除 node_modules 文件夹后再运行 `npm install` 可能有助于消除潜在的问题。 #### 6. 检查环境变量影响 确认所有相关环境变量均已正确定义,并且不影响到程序正常读取路径信息。特别是当涉及到跨平台部署的时候要注意不同操作系统之间的差异。 --- 希望以上的建议可以帮助您解决问题。如果您有更多关于如何配置或调试的具体问题,欢迎继续咨询!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值