Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
chaijinsong opened this issue Aug 13, 2019 · 0 comments
Open

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

chaijinsong opened this issue Aug 13, 2019 · 0 comments

Comments

@chaijinsong
Copy link
Owner

chaijinsong commented Aug 13, 2019

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant