electron下使用子进程找不到第三方包的问题

35次阅读

共计 1677 个字符,预计需要花费 5 分钟才能阅读完成。

electron 下使用子进程,找不到第三方包的问题

场景:electron 打包后,发现子进程用不了,查看 log 发现是缺少一些包,但是子进程中的包在 resource 文件夹中都有之前的文章有介绍 resource 是干嘛的,为什么还会报包缺失呢?

排查错误

先看一下错误信息

我们能够看到报了一个缺少 is-buffer 这个包,但是我在开发环境下没问题啊。关键点其实就是在打包的时候 axios 的依赖没有安装,导致打包完毕后需要用到 axios 的时候,axios 自己的依赖没有安装,导致无法使用。

解决错误

如何解决?很简单,进入项目的node_modules 文件夹,进入子进程需要用到的包,检查该包下有没有安装依赖,如果没有则安装。

一个一个手动检查是否会太麻烦,如果子进程中用到的第三方包很多,那么一个个安装会很麻烦,有没有简便一些的方式呢?

直接写一个脚本给我们检查,在 build 之前执行脚本,检查指定的包下是否安装了依赖,没有的话就安装上,有的话就不忽略。

优化方案

  1. 看过这篇文章的同学都知道,我们的子进程中用到的包,是在 package.json 中进行配置的。

选中的部分就是我们需要检查的包,所以我们只需要拿到这个数组,然后进入对应的目录去检查 node_modules 文件夹就可以了

  1. 开始写代码

    // 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 删除了):

这样就能够自动检查对应的包,不用手动去检查了。

正文完
 0