项目场景:
问题描述
一. 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 里面