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