場景:electron打包後,發現子進程用不了,查看log發現是缺乏一些包,可是子進程中的包在resource文件夾中都有 以前的文章有介紹resource是幹嗎的,爲何還會報包缺失呢?
排查錯誤node
先看一下錯誤信息linux
咱們可以看到報了一個缺乏 is-buffer
這個包,可是我在開發環境下沒問題啊。關鍵點其實就是在打包的時候axios的依賴沒有安裝,致使打包完畢後須要用到axios的時候,axios本身的依賴沒有安裝,致使沒法使用。ios
解決錯誤npm
如何解決?很簡單,進入項目的node_modules
文件夾,進入子進程須要用到的包,檢查該包下有沒有安裝依賴,若是沒有則安裝。json
若是子進程中用到的第三方包不少,那麼一個個安裝會很麻煩,有沒有簡便一些的方式呢?axios
直接寫一個腳本給咱們檢查,在build以前執行腳本,檢查指定的包下是否安裝了依賴,沒有的話就安裝上,有的話就忽略。
優化方案數組
選中的部分就是咱們須要檢查的包,因此咱們只須要拿到這個數組,而後進入對應的目錄去檢查node_modules
文件夾就能夠了electron
開始寫代碼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以前先執行一遍優化
就會獲得以下結果(我提早將axios和archiver下的node_modules刪除了):
這樣就可以自動檢查對應的包,不用手動去檢查了。