阅读 9

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

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

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

排查错误

先看一下错误信息

Xnip2019-08-13_18-57-52

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

Xnip2019-08-13_19-41-21

解决错误

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

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

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

优化方案

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

Xnip2019-08-13_19-49-12

选中的部分就是我们需要检查的包,所以我们只需要拿到这个数组,然后进入对应的目录去检查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之前先执行一遍

    Xnip2019-08-13_19-52-50

    就会得到如下结果(我提前将axios和archiver下的node_modules删除了):

Xnip2019-08-13_19-54-13

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

关注下面的标签,发现更多相似文章
评论