electron项目打包报错

本文聚焦Electron项目,当打包为asar文件后部分依赖模块找不到。介绍了asar文件定义、使用原因,指出操作系统视角下asar是文件,Node.js的fs模块无法将其当虚拟目录。给出两种解决方案,一是设置ignore和extra - resource,二是把node_modules里可执行文件放到node_modules.asar.unpacked里。

项目场景:


问题描述

一. electron项目打包为asar后部分部分依赖模块找不到

原因分析:
Electron 应用中的前端代码最终会打包成 asar 文件,那什么是 asar 文件呢?

1.asar 的定义:asar 是一种文件归档方式,类似于 tar 包,把多个目录和文件合并在一起,但是并不进行压缩
本质上讲,asar 是一个虚拟目录,以一个大文件文件形式保存了指定目录下所有文件的方式。
在这里插入图片描述
2.为什么要用 asar 文件主要有三点原因:

  • 避免 Windows 系统下文件路径过长(Windows 限制最长路径为 260 个字符)
  • 加快 require 函数的加载文件的速度
  • 避免向用户直接暴露代码文件

3.站在操作系统视角来看,asar 是一个文件而并非目录,因此 node.js 自带的 fs 模块是无法把 asar 当做虚拟目录来使用的
不过 Electron 重写了 fs、require、process、child_process 等模块的方法,支持识别 asar 内部的文件,所以上面的代码在 Electron 主进程中是可以正确运行的

因此,通过 require 和 fs 引用 asar 路径,都会执行 Electron 提供的内部实现,而不是 Node.js 原有的实现,如果想获取 asar 文件自身的相关信息,例如计算 checksum 的话,就必须要引用 original-fs 模块


解决方案:

提示:这里填写该问题的具体解决方案:

例如:electron中引入7zip-min和adm-zip依赖
在ele-win目录下引入报错,找不到7zip-min,adm-zip模块

 const _7z = require('7zip-min')
 const AdmZip = window.require('adm-zip')

7zip-min调用node的一些原生模块,列如增加了electron original-fs模块的写入,即使将它安装在electron层下,打包后依旧会报错找不到模块。
这个时候就需要将该依赖包的依赖从asar中提取出来才能够获取到

方法一

可设置

--ignore=7z --extra-resource=7z
  • ignore ,在将默认打包的范围内,排除掉一些不打包进去的。例如第三方资源文件,是无论如何,都不能打包到asar里面的。打包进去的话,或者没有用,占体积。或者影响程序逻辑实现,不能访问到这些第三方资源。
  • extra-resource,可以将第三方资源,在打包的时候,复制到app.asar的同级目录。
    这两个参数的组合效果就是:把第三方资源文件,提升一个目录层级,从app.asar的内部,提升到app.asar的同级
  • 如果仅仅设置extra-resource,而不设置ignore的话,app.asar里面就会有一份多余的resource文件
方法二
# 不打包 .node 文件
$ asar pack app app.asar --unpack *.node
# 不打包 .node 和 .out 文件
$ asar pack test test.asar --unpack "{*.node,*.out}"

把 node_modules 里面的可执行文件放到了 node_modules.asar.unpacked 里面

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值