使用electron下的子进程,找不到第三方包,但子进程中的包在资源文件夹中。上一篇文章介绍了资源是做什么用的。为什么包裹不见了?错误排查首先看报错信息,可以看到报错了is-bufferpackage,但是我在开发环境下没有问题。关键是打包时没有安装axios的依赖,所以打包后需要使用axios时,没有安装axios的依赖,导致无法使用。如何解决错误?很简单,进入项目的node_modules文件夹,进入子进程需要使用的包,查看包下有没有安装依赖,没有就安装。如果子进程中用到的第三方包比较多,一个一个安装会很麻烦。有更容易的方法吗?直接写一个脚本让我们检查。构建前执行脚本,查看指定包下是否安装了依赖。如果没有,安装它,如果是,请忽略它。优化方案看过本文的同学都知道,我们子流程中使用的package都是在package.json中配置的。选中的部分是我们需要检查的包,所以我们只需要获取这个数组,然后进入对应目录检查node_modules文件夹,开始写代码//checkPackage.jsconstfs=require('fs');const{exec}=require('child_process');constpath=require('路径');constconfig=require('./package.json');常量SPLIT_LENGTH=1;//路径长度中的文件夹路径分隔符'/'lengthcheckPackage();functioncheckPackage(){letplatform=['mac','win','linux'];让asarUnpackList=platform.map(name=>{returnconfig.build[name].asarUnpack;}).reduce((old,val)=>{returnold.concat(val);},[]);asarUnpackList=Array.from(newSet(asarUnpackList));让packageArr=asarUnpackList.map(item=>{让start=item.indexOf('node_modules')+'node_modules'.length+SPLIT_LENGTH;让tmpStr=item.substr(start);让packageName=tmpStr.substr(0,tmpStr.indexOf('/'));返回包名;});packageArr.forEach(item=>{console.log(`check${item}`);if(!fs.existsSync(`./node_modules/${item}/node_modules`)){console.log(`安装${item}的依赖项`);//执行当前目录下scripts文件夹下的安装命令,stderr)=>{if(err){console.log(err);return;}console.log('执行cnpminstall',path.join(process.cwd(),`node_modules/${item}`));console.log(`stdout:${stdout}`);});}});}在执行build之前先执行上面的文件会得到如下结果(我把axios和archiver下的node_modules我提前删掉了):这样就可以自动勾选对应的packages,不需要勾选手动
