摘要:導(dǎo)致下載流程受阻問題中使用到子進(jìn)程的時(shí)候,是把子進(jìn)程當(dāng)作一個(gè)外部依賴來做的,打包后并不會將子進(jìn)程的代碼打進(jìn)到包中,需要額外進(jìn)行配置。子進(jìn)程中用的第三方包都需要在中進(jìn)行配置。
在公司開發(fā)的下載器過程中,遇到的一些坑點(diǎn) 1.electron中彈窗的確認(rèn)取消以及系統(tǒng)自帶的叉號之間的關(guān)系
場景:在用戶退出app時(shí),需要提示用戶是否確認(rèn)退出,此時(shí)彈窗出現(xiàn),如果點(diǎn)擊確認(rèn)就繼續(xù)退出,執(zhí)行回調(diào),否則的話,不退出問題:點(diǎn)擊叉號的時(shí)候,回調(diào)中返回的值是0,由于代碼中寫的buttons順序?yàn)閇"確認(rèn)", "取消"],點(diǎn)擊“確認(rèn)”的時(shí)候?qū)?yīng)的response也是0,就導(dǎo)致了點(diǎn)擊“確認(rèn)”和點(diǎn)擊叉號的行為一致,這樣的話是不正確的,點(diǎn)擊叉號應(yīng)該等同于取消退出。
// 問題代碼,點(diǎn)擊確認(rèn)按鈕會退出,點(diǎn)擊右上角叉號也會退出 dialog.showMessageBox(mainWindow, { buttons: ["確認(rèn)", "取消"] }, (response) => { if (reponse === 0) { // 執(zhí)行退出操作 } }); // 修改后代碼,點(diǎn)擊確認(rèn)退出,點(diǎn)擊右上角叉號不退出 dialog.showMessageBox(mainWindow, { buttons: ["取消", "確認(rèn)"] }, (response) => { if (response === 1) { // 執(zhí)行確認(rèn)退出操作 } });2.打包后子進(jìn)程中的代碼沒有執(zhí)行的問題
場景:在本地開發(fā)過程中,使用子進(jìn)程去下載資源,能夠正常的下載,但是打包之后,發(fā)現(xiàn)下載不了,子進(jìn)程中的事件沒有執(zhí)行。導(dǎo)致下載流程受阻問題:electron中使用到子進(jìn)程的時(shí)候,是把子進(jìn)程當(dāng)作一個(gè)外部依賴來做的,打包后并不會將子進(jìn)程的代碼打進(jìn)到包中,需要額外進(jìn)行配置。
解決方式:對子進(jìn)程文件進(jìn)行額外配置注:本項(xiàng)目腳手架基于electron-vue,配置文件和electron-vue保持相同
打包配置:asarUnpack 這個(gè)配置是用來將子進(jìn)程中用的一些第三方包進(jìn)行整理,否則子進(jìn)程找不到這些包,就跑不起來。子進(jìn)程中用的第三方包都需要在asarUnpack中進(jìn)行配置。
extraResources 這個(gè)配置用來將我們的代碼子進(jìn)程文件所在目錄,打包出來放在一個(gè)指定的地方,在代碼中有需要引用子進(jìn)程文件的地方,就用這個(gè)地址去找對應(yīng)的js文件,因?yàn)殚_發(fā)和打包后的路徑是不一樣的,具體package.json配置如下
"mac": { "icon": "build/icons/icon.icns", "extendInfo": { "CFBundleURLSchemes": [ "link" ] }, "asarUnpack": [ "**/node_modules/electron-log/**/*", "**/node_modules/unzipper/**/*", "**/node_modules/axios/**/*", "**/node_modules/archiver/**/*" ], "extraResources": [ { "from": "src/main", "to": "app.asar.unpacked/download" } ] }, "win": { "icon": "build/icons/icon.ico", "asarUnpack": [ "**/node_modules/electron-log/**/*", "**/node_modules/unzipper/**/*", "**/node_modules/axios/**/*", "**/node_modules/archiver/**/*" ], "extraResources": [ { "from": "src/main", "to": "app.asar.unpacked/download" } ], "target": [ { "target": "nsis", "arch": [ "x64" ] } ] }
子進(jìn)程fork路徑:electron中開發(fā)和打包后子進(jìn)程的fork路徑并不相同,開發(fā)時(shí)候,可以直接使用當(dāng)前路徑進(jìn)行引用,但是打包后子進(jìn)程js文件直接通過相對路徑就獲取不到了。所以fork子進(jìn)程的時(shí)候路徑需要如下配置,process.resoucesPath: electron中定義的資源目錄的路徑,在打包后子進(jìn)程js所在的路徑。
let isDev = process.env.NODE_ENV !== "production"; let scriptPath = isDev ? path.join(__dirname, "child_download_serial.js") : path.join(process.resourcesPath, "app.asar.unpacked/download/child_download_serial.js");
上面兩步做完了,打包完畢后可以在安裝后的安裝包下看到自己子進(jìn)程的代碼目錄,此時(shí)說明配置成功,并且子進(jìn)程和主進(jìn)程能夠正常通信了。
以上方案在windows下和mac下都適用
3.子進(jìn)程中的log輸出不了場景:想看一下子進(jìn)程中輸出的log,查看子進(jìn)程的執(zhí)行情況問題:子進(jìn)程的console在控制臺中看不到,因?yàn)樽舆M(jìn)程和父進(jìn)程是分開的,我們只能看到父進(jìn)程的輸出
解決方式:拿到子進(jìn)程后,在父進(jìn)程中監(jiān)聽子進(jìn)程的stdout.on("data")事件,這樣在子進(jìn)程中的所有console.log在父親進(jìn)程中都會觸發(fā)data事件,父進(jìn)程可以輸出子進(jìn)程的console內(nèi)容。注意fork的時(shí)候需要給一個(gè)silent:true的配置,如果為 true,則子進(jìn)程的 stdin、stdout 和 stderr 將會被輸送到父進(jìn)程,否則它們將會繼承自父進(jìn)程。同理,也可以監(jiān)聽子進(jìn)程的stderr的data事件,可以捕獲到子進(jìn)程的錯(cuò)誤
childDownload = fork(scriptPath, [], { silent: true }); childDownload.stdout.on("data", data => { console.log("子進(jìn)程的console", data.toString()); });4.electron閃退的問題
場景:在退出軟件的時(shí)候,由于代碼原因報(bào)了一個(gè)錯(cuò)誤,然后軟件成功關(guān)閉,但是當(dāng)再次手動打開軟件時(shí),出現(xiàn)閃退情況問題:主進(jìn)程出錯(cuò)后,沒有對錯(cuò)誤進(jìn)行捕獲,導(dǎo)致再次打開軟件依然有這個(gè)錯(cuò)誤存在,軟件打不開
解決方式:全局進(jìn)行一個(gè)錯(cuò)誤捕獲,避免某些情況下的錯(cuò)誤未捕獲導(dǎo)致閃退打不開軟件的問題
// 必要的全局錯(cuò)誤捕獲 process.on("uncaughtException", error => { log.error(error.stack || JSON.stringify(error)); app.exit(); });5.web端喚醒客戶端覆蓋問題
場景:錯(cuò)題本下載器安裝后,再安裝錯(cuò)題本logger工具,此時(shí)再web中點(diǎn)擊喚醒下載工具,喚醒的是錯(cuò)題本logger工具6.electron下使用子進(jìn)程,找不到第三方包的問題問題:再兩者打包的時(shí)候,對應(yīng)的appId都是相同的,導(dǎo)致后安裝的軟件將前安裝的軟件給頂替了,當(dāng)再網(wǎng)頁中喚醒的時(shí)候,就將替換后的軟件喚醒了
解決方式:package.json中的appId保證唯一性
electron下使用子進(jìn)程,找不到第三方包的問題
原文鏈接:https://github.com/chaijinson... 持續(xù)更新
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/106444.html
摘要:其實(shí)這個(gè)應(yīng)用并不是那么的特別需求,一來本人寫越來越少,二來開發(fā)工作也是越做越少,再者目前的編輯器幾乎都支持直接剪切板上傳圖片,使圖床應(yīng)用的場景越來越少。 其實(shí)這個(gè)應(yīng)用并不是那么的特別需求,一來本人寫blog越來越少,二來開發(fā)工作也是越做越少,再者目前的編輯器幾乎都支持直接剪切板上傳圖片,使圖床應(yīng)用的場景越來越少。不過本人本著不想丟棄技術(shù)的內(nèi)心想法,以及鍛煉自己寫一個(gè)完整項(xiàng)目,還是開啟了...
摘要:前言本文主要介紹如何通過及兩種方式,將已有的應(yīng)用打包成格式和可執(zhí)行文件。導(dǎo)致了在打包的過程中非常慢。由于是初次接觸,如讀者在文中發(fā)現(xiàn)錯(cuò)誤,請及時(shí)指正。 前言 showImg(https://segmentfault.com/img/bV6zNn?w=1319&h=594); 本文主要介紹如何通過electron-packager及electron-builder兩種方式,將已有的ele...
摘要:例發(fā)信方收信方三使用打包時(shí)注意事項(xiàng)打包文件夾時(shí),文件夾內(nèi)不要用奇奇怪怪的文件比如等,以及名稱帶有漢字的文件。 之前兩章寫了electron的基本用法,本來想接著寫用jquery去完整的寫一個(gè)程序來著,但是考慮到一是js實(shí)在沒啥好寫的,再就是我現(xiàn)在寫的這個(gè)程序并不想開源,所以一直就沒寫下去。這兩天重裝系統(tǒng)后重新配置了環(huán)境變量,再執(zhí)行時(shí)遇到一些坑,就記錄下來,以免以后再進(jìn)坑。 一、elec...
摘要:本來寫這個(gè)項(xiàng)目時(shí)就沒打算來自己實(shí)現(xiàn)富文本編輯器,本著能用開源就用開源的原則,在項(xiàng)目里測試了一些開源的編輯器,發(fā)現(xiàn)或多或少都有些問題,后來一琢磨,反正這個(gè)項(xiàng)目的富文本編輯器需求不復(fù)雜,就自己實(shí)現(xiàn)一個(gè)好了。 斷斷續(xù)續(xù)寫了個(gè)把月,終于在昨天完成了第一版… 筆落寫作 一款幫助網(wǎng)絡(luò)寫手更方便地進(jìn)行小說創(chuàng)作的PC軟件,目前支持 OSX/Windows 名字靈感來自于杜甫的一首詩,前兩句是: 《寄...
閱讀 2122·2023-04-26 00:50
閱讀 2494·2021-10-13 09:39
閱讀 2229·2021-09-22 15:34
閱讀 1624·2021-09-04 16:41
閱讀 1350·2019-08-30 15:55
閱讀 2446·2019-08-30 15:53
閱讀 1720·2019-08-30 15:52
閱讀 756·2019-08-29 16:19