詳解使用webpack+electron+reactJs開發(fā)windows桌面應(yīng)用
electron是一兩年前挺火的一個(gè)框架
本質(zhì)上是一個(gè)瀏覽器,但是集成了很多windows系統(tǒng)的功能,讓前端開發(fā)也可以直接操作windows的窗體,做成一個(gè)實(shí)打?qū)嵉淖烂孳浖?/p>
(當(dāng)然聽說(shuō)mac上也可以用electron,不過(guò)沒(méi)試過(guò))
(沒(méi)錯(cuò)我還在用windows,不是mac也不是linux,我是個(gè)lowB)
團(tuán)隊(duì)主要的技術(shù)棧是react,所以考慮用react開發(fā),方便維護(hù)。
PS.由于項(xiàng)目是大半年前做的,所以一些細(xì)節(jié)可能記憶有誤請(qǐng)見諒
幾個(gè)重點(diǎn):
1.想要能調(diào)試必須使用webpack打包,不能用react那些常用的打包腳手架,因?yàn)閣ebpack打包有target: "electron-main"
2.對(duì)于不使用electron模塊的項(xiàng)目,electron可以直接跑任何網(wǎng)頁(yè);對(duì)于用到electron模塊的項(xiàng)目,如果不設(shè)置target: "electron-main",而直接用webpack打包(或者其他的打包工具),打包工具會(huì)直接默認(rèn)把electron模塊一起打包進(jìn)去。而electron模塊里會(huì)用到node的比如fs模塊,這些模塊都不允許在網(wǎng)頁(yè)上調(diào)用,因?yàn)樾枰苯釉L問(wèn)電腦文件
下面開始
我們知道electron其實(shí)是有兩個(gè)部分的,一個(gè)是窗體部分,一個(gè)是窗體里運(yùn)行的網(wǎng)頁(yè)項(xiàng)目
窗體部分通常放在根目錄下,只使用main.js一個(gè)文件來(lái)控制
網(wǎng)頁(yè)項(xiàng)目部分一般放在src目錄下,打包出來(lái)的文件放到dist目錄下
目錄大致如下

main.js文件里會(huì)對(duì)窗體部分做很多配置
具體可以參見electron的官方文檔:electron官方文檔
mainWnd = new BrowserWindow({
// 窗體配置參數(shù)
});
mainWnd.loadURL(`file://${__dirname}/dist/index.html`); //這句話是用于配置窗體加載的網(wǎng)頁(yè)項(xiàng)目的,配置為打包后的目錄
網(wǎng)頁(yè)項(xiàng)目部分使用ipc模塊與electron的窗體部分的ipcMain模塊進(jìn)行通信,網(wǎng)頁(yè)項(xiàng)目部分可以發(fā)送以某個(gè)指令給窗體部分
網(wǎng)頁(yè)項(xiàng)目部分發(fā)送指令
// src/MyComponent.js
const ipc = require('electron').ipcRenderer;
ipc.send('logout');
窗體部分接收到指令后做相應(yīng)的行為
//main.js
ipcMain.on('logout', function (event, arg) {
// do something
console.log('logint');
});
窗體部分也可以使用webContent模塊與網(wǎng)頁(yè)項(xiàng)目部分通信
比如用戶點(diǎn)擊關(guān)閉窗體,可以使用event.preventDefault();阻塞關(guān)閉,然后通知網(wǎng)頁(yè)項(xiàng)目部分,做退出登錄的行為,退登完成之后再關(guān)閉窗體
// main.js
mainWnd.webContents.send('mainWnd-close');
網(wǎng)頁(yè)項(xiàng)目部分做對(duì)應(yīng)的行為
比如退出登錄,退出登錄完成后,也使用ipc通知窗體部分,窗體接收到'logout-succ'后,執(zhí)行關(guān)閉窗體的行為。
// src/MyComponent.js
ipc.on('mainWnd-close', () => {
// do something
ipc.send('logout-succ');
})
·在開發(fā)項(xiàng)目時(shí),可以先用網(wǎng)頁(yè)的形式開發(fā)項(xiàng)目,等到網(wǎng)頁(yè)項(xiàng)目部分差不多完成后,再注入electron中,開發(fā)網(wǎng)頁(yè)項(xiàng)目部分和窗體部分的交互
·在webpack中使用target: "electron-main"后,webpack將不會(huì)打包有關(guān)eletron的代碼
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
React性能優(yōu)化的實(shí)現(xiàn)方法詳解
react憑借virtual DOM和diff算法擁有高效的性能,除此之外也有很多其他的方法和技巧可以進(jìn)一步提升react性能,在本文中我將列舉出可有效提升react性能的幾種方法,幫助我們改進(jìn)react代碼,提升性能2023-01-01
react執(zhí)行【npx create-react-app my-app】出現(xiàn)常見錯(cuò)誤的解決辦法
文章主要介紹了在使用npx創(chuàng)建React應(yīng)用時(shí)可能遇到的幾種常見錯(cuò)誤及其解決方法,包括缺少依賴、網(wǎng)絡(luò)問(wèn)題和npx解析錯(cuò)誤等,并提供了相應(yīng)的解決措施,此外,還提到了使用騰訊云云產(chǎn)品來(lái)支持React應(yīng)用開發(fā)2024-11-11
React?Refs?的使用forwardRef?源碼示例解析
這篇文章主要為大家介紹了React?之?Refs?的使用和?forwardRef?的源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
React使用ref進(jìn)行訪問(wèn)DOM元素或組件
在 React 里,ref 就像是一個(gè)神奇的小助手,能讓你直接去訪問(wèn) DOM 元素或者組件實(shí)例,下面就跟隨小編一起來(lái)學(xué)習(xí)一下具體的使用方法吧2025-03-03
React中useEffect Hook常見問(wèn)題及解決
React的useEffect Hook它允許我們?cè)诤瘮?shù)組件中執(zhí)行副作用操作,但在使用過(guò)程中可能會(huì)遇到一些常見的錯(cuò)誤,本文就來(lái)介紹一下常見問(wèn)題及解決,感興趣的可以了解一下2023-10-10
ReactNative實(shí)現(xiàn)的橫向滑動(dòng)條效果
本文介紹了ReactNative實(shí)現(xiàn)的橫向滑動(dòng)條效果,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),補(bǔ)充介紹了ReactNative基于寬度變化實(shí)現(xiàn)的動(dòng)畫效果,感興趣的朋友跟隨小編一起看看吧2024-02-02
react navigation中點(diǎn)擊底部tab怎么傳遞參數(shù)
本文主要介紹了react navigation中點(diǎn)擊底部tab怎么傳遞參數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
React新擴(kuò)展函數(shù)setState與lazyLoad及hook介紹
這篇文章主要介紹了React新擴(kuò)展函數(shù)setState與lazyLoad及hook,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-12-12

