electron下使用子進程,找不到第三方包的問題

electron下使用子進程,找不到第三方包的問題

場景:electron打包後,發現子進程用不了,查看log發現是缺乏一些包,可是子進程中的包在resource文件夾中都有 以前的文章有介紹resource是幹嗎的,爲何還會報包缺失呢?

排查錯誤node

先看一下錯誤信息
Xnip2019-08-13_18-57-52linux

咱們可以看到報了一個缺乏 is-buffer 這個包,可是我在開發環境下沒問題啊。關鍵點其實就是在打包的時候axios的依賴沒有安裝,致使打包完畢後須要用到axios的時候,axios本身的依賴沒有安裝,致使沒法使用。
Xnip2019-08-13_19-41-21ios

解決錯誤npm

如何解決?很簡單,進入項目的node_modules 文件夾,進入子進程須要用到的包,檢查該包下有沒有安裝依賴,若是沒有則安裝。json

若是子進程中用到的第三方包不少,那麼一個個安裝會很麻煩,有沒有簡便一些的方式呢?axios

直接寫一個腳本給咱們檢查,在build以前執行腳本,檢查指定的包下是否安裝了依賴,沒有的話就安裝上,有的話就忽略。

優化方案數組

  1. 看過這篇文章的同窗都知道,咱們的子進程中用到的包,是在package.json中進行配置的。

Xnip2019-08-13_19-49-12

選中的部分就是咱們須要檢查的包,因此咱們只須要拿到這個數組,而後進入對應的目錄去檢查node_modules文件夾就能夠了electron

  1. 開始寫代碼post

    // 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

這樣就可以自動檢查對應的包,不用手動去檢查了。

相關文章
相關標籤/搜索