vue與electron實(shí)現(xiàn)進(jìn)程間的通信詳情
前言:
本文主要介紹electron渲染進(jìn)程和主進(jìn)程間的通信,以及在渲染進(jìn)程和主進(jìn)程中常用的配置項(xiàng)。
一、配置內(nèi)容
1.進(jìn)程間的通信
渲染進(jìn)程和主進(jìn)程間的通信主要通過(guò)ipcRenderer和ipcMain這兩個(gè)模塊實(shí)現(xiàn)的,其中ipcRenderer是在渲染進(jìn)程中使用,ipcMain在主進(jìn)程中使用。
其中,渲染進(jìn)程使用ipcRenderer有兩種方式
第一種方式引入ipcRenderer
這種方式主要是通過(guò)Electron窗口的preload方法實(shí)現(xiàn)的,以下是實(shí)現(xiàn)步驟
首先我們創(chuàng)建一個(gè)preload.js文件,把文件放入到public文件中
// preload.js
window.ipcRenderer = require('electron').ipcRenderer;之后在主進(jìn)程中引入:
import { BrowserWindow, ipcMain } from 'electron'
let win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
contextIsolation: false,
// eslint-disable-next-line no-undef
preload: __static + '/preload.js'
}
})
// 順便這里放一個(gè)主進(jìn)程的監(jiān)聽(tīng)
ipcMain.on('pong', (e, args) => {
console.log('這里是主進(jìn)程pong', args)
e.sender.send('ping', '你好 我是主進(jìn)程')
})這樣我們就可以再渲染進(jìn)程直接使用window.ipcRenderer,去監(jiān)聽(tīng)或發(fā)送事件了。
// App.vue
// 渲染進(jìn)程的監(jiān)聽(tīng)
window.ipcRenderer.on('pang', (e, arg) => {
console.log('渲染進(jìn)程===我收到啦', arg)
})
// 渲染進(jìn)程發(fā)送事件===這個(gè)可以放到一個(gè)點(diǎn)擊事件里面去觸發(fā)
window.ipcRenderer.send('ping', '你好呀,我是渲染進(jìn)程')實(shí)驗(yàn)結(jié)果如下,這里注意主進(jìn)程的打印是在終端里面輸出的:

第二種方式引入ipcRenderer
首先我們需要先安裝一個(gè)插件,這是由于在webpack5中移除了nodejs核心模塊的polyfill自動(dòng)引入,所以需要手動(dòng)引入,這里我的腳手架version是5.0.8
npm install node-polyfill-webpack-plugin // or yarn add node-polyfill-webpack-plugin
之后在vue.config.js中引入
// vue.config.js
const NodePolyfillPlugin = require('node-polyfill-webpack-plugin')
module.exports = defineConfig({
...
configureWebpack: {
plugins: [new NodePolyfillPlugin()],
}
})在主進(jìn)程文件中,創(chuàng)建窗口時(shí)這樣設(shè)置
const win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true,
contextIsolation: false
}
})最后我們?cè)阡秩具M(jìn)程的入口文件main.js引入ipcRenderer
// main.js
window.ipcRenderer = window.require('electron').ipcRenderer實(shí)驗(yàn)方式和結(jié)果同方法一相同。
這里再給大家說(shuō),要使用window.require('electron').ipcRenderer這種方式。
是因?yàn)橹苯?code>window.ipcRenderer = require('electron').ipcRenderer這樣引入會(huì)報(bào)錯(cuò),如下:

出現(xiàn)這個(gè)錯(cuò)誤的原因主要是因?yàn)椋簄odejs運(yùn)行時(shí)的require與編譯時(shí)webpack的require是不同的。默認(rèn)情況下,window是全局的,然而在webpack編譯時(shí)會(huì)忽略window。 具體情況可以點(diǎn)擊查看
以上我們就可以實(shí)現(xiàn)渲染進(jìn)程和主進(jìn)程的相互通信。
2.渲染進(jìn)程常用配置
接下來(lái)我們就統(tǒng)一引入下在渲染進(jìn)程中常用的配置,其中ipcRenderer用于渲染進(jìn)程與主進(jìn)程通信或渲染進(jìn)程與渲染進(jìn)程間通信; $remote用于獲取當(dāng)前主窗口的一些信息;$shell用于將連接用默認(rèn)瀏覽器打開(kāi)或者啟動(dòng)默認(rèn)應(yīng)用之類(lèi)的。
// 判斷是否是electron環(huán)境
window.$isElectron = window?.process?.versions.electron !== undefined
// 判斷是否是macOS系統(tǒng)
window.$isMac = /macintosh|mac os x/i.test(navigator.userAgent)
// 將渲染進(jìn)程通信實(shí)例掛載到window上
window.ipcRenderer = window.require('electron').ipcRenderer
// `remote`模塊為渲染進(jìn)程(web頁(yè)面)和主進(jìn)程通信(IPC)提供了一種簡(jiǎn)單方法。
window.$remote = window.require('electron').remote
// 將使用默認(rèn)應(yīng)用程序管理文件和 url實(shí)例掛載到window上
window.$shell = window.require('electron').shell這些配置可以用上面兩種任意方式引入渲染進(jìn)程都可以。
這里要注意 remote 模塊在 Electron 12 廢棄,并將在 Electron 14 被移除. 由@electronic/remote 模塊替代。
當(dāng)前我們的版本是electron13,所以我們還可以正常使用remote 模塊就行。
如果使用remote 模塊,我們需要在創(chuàng)建窗口實(shí)例中加入一項(xiàng)配置enableRemoteModule: true ,
如下所示:
const win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true,
contextIsolation: false,
enableRemoteModule: true
}
})以下附上關(guān)于@electronic/remote的官網(wǎng)講解的注意事項(xiàng)
Note: Since this is requiring a module through npm rather than a built-in module, if you're using remote from a sandboxed process, you'll need to configure your bundler appropriately to package the code of @electron/remote in the preload script. Of course, using @electron/remote makes the sandbox much less effective.
Note: In electron >= 14.0.0, you must use the new enable API to enable the remote module for each desired WebContents separately: require("@electron/remote/main").enable(webContents).
In electron < 14.0.0, @electron/remote respects the enableRemoteModule WebPreferences value. You must pass { webPreferences: { enableRemoteModule: true } } to the constructor of BrowserWindows that should be granted permission to use @electron/remote.
這里給大家展示下關(guān)于remote和shell的常用方法,如下:
// remote --- 獲取當(dāng)前窗口實(shí)例,之后可以調(diào)用窗口的放大縮小關(guān)閉等方法 window.$remote.getCurrentWindow() // shell --- 用默認(rèn)瀏覽器打開(kāi)這個(gè)鏈接 window.shell.openExternal(url)
3.將ipcMain封裝到一個(gè)js中統(tǒng)一處理
創(chuàng)建一個(gè)IpcMainEvent.js文件,之后再background中引入,這樣便于管理
import { ipcMain } from 'electron'
export const IpcMainEvent = (win) => {
// 監(jiān)聽(tīng)登錄成功
ipcMain.on('login', (event, arg) => {
// ....
})
}import { IpcMainEvent } from './IpcMainEvent'
// win為窗口實(shí)例
IpcMainEvent(win)三、總結(jié)
以上關(guān)于electron+vue的項(xiàng)目的一些基礎(chǔ)配置我們就算是完成了。接下來(lái)就可以搭建項(xiàng)目的業(yè)務(wù)部分了。后續(xù)會(huì)繼續(xù)給大家介紹關(guān)于electron窗口相關(guān)的配置等,完善桌面應(yīng)用。
到此這篇關(guān)于vue與electron實(shí)現(xiàn)進(jìn)程間的通信詳情的文章就介紹到這了,更多相關(guān)vue electron通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
項(xiàng)目遷移vite引入圖片資源報(bào)require?is?not?defined問(wèn)題的解決辦法
這篇文章主要給大家介紹了關(guān)于項(xiàng)目遷移vite引入圖片資源報(bào)require?is?not?defined問(wèn)題的解決辦法,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用vite具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01
vue實(shí)現(xiàn)的上拉加載更多數(shù)據(jù)/分頁(yè)功能示例
這篇文章主要介紹了vue實(shí)現(xiàn)的上拉加載更多數(shù)據(jù)/分頁(yè)功能,涉及基于vue的事件響應(yīng)、數(shù)據(jù)交互等相關(guān)操作技巧,需要的朋友可以參考下2019-05-05
Vue3利用組合式函數(shù)和Shared Worker實(shí)現(xiàn)后臺(tái)分片上傳
這篇文章主要為大家詳細(xì)介紹了Vue3如何利用組合式函數(shù)和Shared Worker實(shí)現(xiàn)后臺(tái)分片上傳(帶哈希計(jì)算),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10
element的el-table中記錄滾動(dòng)條位置的示例代碼
這篇文章主要介紹了element的el-table中記錄滾動(dòng)條位置的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
vuejs使用FormData實(shí)現(xiàn)ajax上傳圖片文件
本篇文章主要介紹了vuejs使用FormData實(shí)現(xiàn)ajax上傳圖片文件,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08
vue引入element-ui之后,頁(yè)面是空白的問(wèn)題及解決
這篇文章主要介紹了vue引入element-ui之后,頁(yè)面是空白的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
vue頁(yè)面回退或關(guān)閉,發(fā)送請(qǐng)求不中斷問(wèn)題
這篇文章主要介紹了vue頁(yè)面回退或關(guān)閉,發(fā)送請(qǐng)求不中斷問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Vue組件通信入門(mén)之Provide和Inject機(jī)制
這篇文章主要給大家介紹了關(guān)于Vue組件通信入門(mén)之Provide和Inject機(jī)制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Vue組件通信具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
vue之input輸入框防抖debounce函數(shù)的使用方式
這篇文章主要介紹了vue之input輸入框防抖debounce函數(shù)的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
在vue項(xiàng)目中使用codemirror插件實(shí)現(xiàn)代碼編輯器功能
這篇文章主要介紹了在vue項(xiàng)目中使用codemirror插件實(shí)現(xiàn)代碼編輯器功能(代碼高亮顯示及自動(dòng)提示),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08

