electron下使用子进程,找不到第三方包的问题
场景:electron打包后,发现子进程用不了,查看log发现是缺少一些包,但是子进程中的包在resource文件夹中都有之前的文章有介绍resource是干嘛的,为什么还会报包缺失呢?
排查错误
先看一下错误信息
我们能够看到报了一个缺少 is-buffer
这个包,但是我在开发环境下没问题啊。关键点其实就是在打包的时候axios的依赖没有安装,导致打包完毕后需要用到axios的时候,axios自己的依赖没有安装,导致无法使用。
解决错误
如何解决?很简单,进入项目的node_modules
文件夹,进入子进程需要用到的包,检查该包下有没有安装依赖,如果没有则安装。
如果子进程中用到的第三方包很多,那么一个个安装会很麻烦,有没有简便一些的方式呢?
直接写一个脚本给我们检查,在build之前执行脚本,检查指定的包下是否安装了依赖,没有的话就安装上,有的话就忽略。
优化方案
- 看过这篇文章的同学都知道,我们的子进程中用到的包,是在package.json中进行配置的。
选中的部分就是我们需要检查的包,所以我们只需要拿到这个数组,然后进入对应的目录去检查node_modules
文件夹就可以了
-
开始写代码
// checkPackage.js const fs = require('fs'); const { exec } = require('child_process'); const path = require('path'); const config = require('./package.json'); const SPLIT_LENGTH = 1; // 路径中的文件夹路径切割符长度 '/' 的长度 checkPackage(); function checkPackage() { let platform = ['mac', 'win', 'linux']; let asarUnpackList = platform.map(name => { return config.build[name].asarUnpack; }).reduce((old, val) => { return old.concat(val); }, []); asarUnpackList = Array.from(new Set(asarUnpackList)); let packageArr = asarUnpackList.map(item => { let start = item.indexOf('node_modules') + 'node_modules'.length + SPLIT_LENGTH; let tmpStr = item.substr(start); let packageName = tmpStr.substr(0, tmpStr.indexOf('/')); return packageName; }); packageArr.forEach(item => { console.log(`检查 ${item}`); if (!fs.existsSync(`./node_modules/${item}/node_modules`)) { console.log(`安装${item} 的依赖`); // 在当前目录下的scripts文件夹里执行安装命令命令 exec('cnpm install', { cwd: path.join(process.cwd(), `node_modules/${item}`) }, (err, stdout, stderr) => { if (err) { console.log(err); return; } console.log('执行了cnpm install', path.join(process.cwd(), `node_modules/${item}`)); console.log(`stdout: ${stdout}`); }); } }); }
将上面的文件在执行build之前先执行一遍
就会得到如下结果(我提前将axios和archiver下的node_modules删除了):
这样就能够自动检查对应的包,不用手动去检查了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。