国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

electron-vite中的ipc通信

這篇具有很好參考價(jià)值的文章主要介紹了electron-vite中的ipc通信。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1. 概述

再electron中,進(jìn)程間的通信通過ipcMain和ipcRenderer模塊,這些通道是任意和雙向的

1.1. 什么是上下文隔離進(jìn)程

ipc通道是通過預(yù)加載腳本綁定到window對(duì)象的electron對(duì)象屬性上的

2. 通信方式

2.1. ipcMain(也就是渲染進(jìn)程向主進(jìn)程的通信 單向)

  • 如果要將渲染器進(jìn)程發(fā)送的主進(jìn)程,我們使用ipcRenderer.send()在渲染進(jìn)程中發(fā)送信息,然后在主進(jìn)程中通過ipcMain.on來接收到渲染進(jìn)程所發(fā)送的信息

2.2. 渲染器進(jìn)程到主進(jìn)程(雙向)

  • 雙向 IPC 的一個(gè)常見應(yīng)用是從渲染器進(jìn)程代碼調(diào)用主進(jìn)程模塊并等待結(jié)果。 這可以通過將 ipcRenderer.invoke 與 ipcMain.handle 搭配使用來完成。

2.3. 主進(jìn)程到渲染進(jìn)程

  • 將消息從主進(jìn)程發(fā)送到渲染器進(jìn)程時(shí),需要指定是哪一個(gè)渲染器接收消息。 消息需要通過其 WebContents 實(shí)例發(fā)送到渲染器進(jìn)程。 此 WebContents 實(shí)例包含一個(gè) send 方法,其使用方式與 ipcRenderer.send 相同。

3. 在electron-vite腳手架中進(jìn)行統(tǒng)一使用

當(dāng)用electron-vite腳手架搭建完項(xiàng)目之后在src文件夾下有三個(gè)文件夾

他們分別是:

  • main 主進(jìn)程
  • preload 預(yù)加載腳本
  • renderer ui界面/渲染進(jìn)程

3.1. ipcMain(也就是渲染進(jìn)程向主進(jìn)程的通信 單向)

  1. 首先在main.ts中新建ipc.ts文件來寫入ipc通道和src目錄在新建common(和main文件夾同級(jí))來綁定ipc事件信息

electron-vite中的ipc通信,electron,javascript,前端

//我們?cè)谶@個(gè)中定義ipc的事件名稱,翻遍后續(xù)的事件管理
export enum IpcEvents{
  SAYHELLO="sayhello"
}
//引入相關(guān)的事件名稱
import {ipcMain} from 'electron'
import {IpcEvents} from "../common/ipcEvents";


//ipc事件注冊(cè)函數(shù)
const register=async ():Promise<void>=>{
  ipcMain.on(IpcEvents.SAYHELLO,async (e)=>{
    console.log('hello')
  })
	
}
export default {register}

最后一步我們需要再main/index.ts主進(jìn)程文件中注冊(cè)ipc通道事件

//首先引入我們的ipc文件
import ipc from './ipc'


//然后我們找到這個(gè)函數(shù)
app.whenReady().then(async () => {
  // Set app user model id for windows
	...
  ...
  await ipc.register()   //需要注意的是我們要在這兒createWindwo()函數(shù)之前注冊(cè)ipc事件(也就是在創(chuàng)建窗口之前注冊(cè))
  createWindow()
	...
  ...

})

在渲染進(jìn)程中使用

<template>
  <div class="home">
    <n-button @click="clickHandler">點(diǎn)擊</n-button>
  </div>
</template>
<script lang="ts" setup>
import {IpcEvents} from "../../../../../common/ipcEvents";
//在此處點(diǎn)擊事件
const clickHandler=()=>{
  window.electron.ipcRenderer.send(IpcEvents.SAYHELLO)   //此處調(diào)用事件
}
</script>
<style lang="scss" scoped>
.home{
  height: 100%;
  padding: 16px;
}
</style>

當(dāng)我們點(diǎn)擊后發(fā)現(xiàn)控制臺(tái)出現(xiàn)相應(yīng)的打印輸出后表示注冊(cè)成功

electron-vite中的ipc通信,electron,javascript,前端

3.1.1. 如何進(jìn)行傳參

  • 我們?cè)趇pc通道中進(jìn)行參數(shù)/數(shù)據(jù)傳遞的時(shí)候,建議使用JSON序列化
<template>
  <div class="home">
    <n-button @click="clickHandler">點(diǎn)擊</n-button>
  </div>
</template>
<script lang="ts" setup>
import {IpcEvents} from "../../../../../common/ipcEvents";
const datalist=[
  {name:"yu",age:23,sex:"男"},
  {name:"chao",age:23,sex:"女"},
  {name:"zhi",age:23,sex:"未知"},
  {name:"wang",age:24,sex:"男"},
]
const clickHandler=()=>{
  const data=JSON.stringify(datalist)
  window.electron.ipcRenderer.send(IpcEvents.SAYHELLO,data)
}
</script>
<style lang="scss" scoped>
.home{
  height: 100%;
  padding: 16px;
}
</style>
import {ipcMain} from 'electron'
import {IpcEvents} from "../common/ipcEvents";

const register=async ():Promise<void>=>{
  ipcMain.on(IpcEvents.SAYHELLO,async (e,data)=>{
    const dataList=JSON.parse(data)
    console.log(dataList)
  })
}

export default {register}

點(diǎn)擊后會(huì)發(fā)現(xiàn)在控制臺(tái)中中文會(huì)亂碼

electron-vite中的ipc通信,electron,javascript,前端

electron中中文亂碼解決方案

在啟動(dòng)命令之前添加chcp 65001解決electron控制臺(tái)下打印中文亂碼

    "dev": "chcp 65001 && electron-vite dev",

electron-vite中的ipc通信,electron,javascript,前端

?文章來源地址http://www.zghlxwxcb.cn/news/detail-816793.html

現(xiàn)在我們重新啟動(dòng)項(xiàng)目,可以清除的看到中文不會(huì)亂碼

electron-vite中的ipc通信,electron,javascript,前端

3.2. 主進(jìn)程向渲染進(jìn)程通信

我們首先在src/renderer/src下新建文件夾名hook

然后新建文件useIpcRendererOn.ts

import { onUnmounted } from 'vue'

//這兒要注意引入的ipc事件的地址,然后無腦粘貼
import { IpcEvents } from '../../../common/ipcEvents'

type IpcRendererListener = (event: any, ...args: any[]) => void


//用于監(jiān)聽主進(jìn)程向渲染進(jìn)行雙向的通信
export default function useIpcRendererOn(
  channel: IpcEvents,
  listener: IpcRendererListener
): any {
  const ipc = (window as any).electron.ipcRenderer

  onUnmounted(() => {
    ipc.removeListener(channel, listener)
  })

  return (window as any).electron.ipcRenderer.on(channel, listener)
}

重新定義新的事件名稱

//我們?cè)谶@個(gè)中定義ipc的事件名稱,翻遍后續(xù)的事件管理
export enum IpcEvents{
  SAYHELLO="sayhello",
  SAYWORLD="sayworld"
}

住進(jìn)程向渲染進(jìn)程發(fā)送消息

import {ipcMain} from 'electron'
import {IpcEvents} from "../common/ipcEvents";

const register=async ():Promise<void>=>{
  ipcMain.on(IpcEvents.SAYHELLO,async (e,data)=>{
    const dataList=JSON.parse(data)
    console.log(dataList)
    const world=JSON.stringify([
      {
        name:"這個(gè)是主進(jìn)程傳遞過來的",
        value:1
      }
    ])
    //在這兒向渲染進(jìn)程發(fā)送信息
    e.sender.send(IpcEvents.SAYWORLD,world)
  })
}

export default {register}

我們?cè)阡秩具M(jìn)程中來監(jiān)聽主程序的發(fā)送的數(shù)據(jù)

<template>
  <div class="home">
    <n-button @click="clickHandler">點(diǎn)擊</n-button>
  </div>
</template>
<script lang="ts" setup>
import {IpcEvents} from "../../../../../common/ipcEvents";
import useIpcRendererOn from "../../../hook/useIpcRendererOn";
const datalist=[
  {name:"yu",age:23,sex:"男"},
  {name:"chao",age:23,sex:"女"},
  {name:"zhi",age:23,sex:"未知"},
  {name:"wang",age:24,sex:"男"},
]
const clickHandler=()=>{
  const data=JSON.stringify(datalist)
  window.electron.ipcRenderer.send(IpcEvents.SAYHELLO,data)
}
//用來監(jiān)聽渲染進(jìn)程發(fā)送的信息
useIpcRendererOn(IpcEvents.SAYWORLD,async (_,data)=>{
  const list=JSON.parse(data)
  console.log(list)
})
</script>
<style lang="scss" scoped>
.home{
  height: 100%;
  padding: 16px;
}
</style>

當(dāng)我們點(diǎn)擊按鈕后回清晰看到在頁(yè)面的開發(fā)者工具中打印出來主進(jìn)程中傳遞過來的數(shù)據(jù)

electron-vite中的ipc通信,electron,javascript,前端

上述行為整體剖析

  • 我們首先通過在頁(yè)面中進(jìn)行點(diǎn)擊來觸發(fā)window.electron.ipcRenderer.send(IpcEvents.SAYHELLO,data)中的SAYHELLO事件
  • 然后在住進(jìn)程中通過 ipcMain.on(IpcEvents.SAYHELLO)接收到相對(duì)應(yīng)的點(diǎn)擊事件并打印(打印在控制臺(tái))
  • 然后再通過e.sender.send(IpcEvents.SAYWORLD)向渲染進(jìn)程發(fā)送信息
  • 渲染進(jìn)程通過useIpcRendererOn(IpcEvents.SAYWORLD),來監(jiān)聽SAYWORLD主進(jìn)程發(fā)送的事件

由以上四步在住進(jìn)程中形成了統(tǒng)一的閉環(huán)操作。

以上情況幾乎能夠完成所有的ipc通信操作,還有一種情況后續(xù)再說

3.3. 擇日不如撞日(最后一種方式)雙向奔赴

首先在ipcEvents.ts中注冊(cè)一個(gè)事件名稱

export enum IpcEvents{
  SAYHELLO="sayhello",
  SAYWORLD="sayworld",
  SAYTHANKYOU='Thankyou'
}

我們首先在渲染界面發(fā)送消息

<template>
  <div class="home">
    <n-button @click="clickHandler">點(diǎn)擊</n-button>
    <n-button @click="sayTankyouHandler">說謝謝</n-button>
  </div>
</template>
<script lang="ts" setup>
import {IpcEvents} from "../../../../../common/ipcEvents";
import useIpcRendererOn from "../../../hook/useIpcRendererOn";
const datalist=[
  {name:"yu",age:23,sex:"男"},
  {name:"chao",age:23,sex:"女"},
  {name:"zhi",age:23,sex:"未知"},
  {name:"wang",age:24,sex:"男"},
]
const clickHandler=()=>{
  const data=JSON.stringify(datalist)
  window.electron.ipcRenderer.send(IpcEvents.SAYHELLO,data)
}
useIpcRendererOn(IpcEvents.SAYWORLD,async (_,data)=>{
  const list=JSON.parse(data)
  console.log(list)
})
const sayTankyouHandler=async ()=>{
  //這兒發(fā)送消息,向主進(jìn)程
  await window.electron.ipcRenderer.invoke(IpcEvents.SAYTHANKYOU).then((data: string) => {
    //data便是渲染進(jìn)程中然會(huì)過來的數(shù)據(jù)
    console.log(data)
  })
}
</script>
<style lang="scss" scoped>
.home{
  height: 100%;
  padding: 16px;
}
</style>

住進(jìn)程中接收并返回

import {ipcMain} from 'electron'
import {IpcEvents} from "../common/ipcEvents";

const register=async ():Promise<void>=>{
  ipcMain.on(IpcEvents.EVPLAY,async (e,data)=>{
    const dataList=JSON.parse(data)
    console.log(dataList)
    const world=JSON.stringify([
      {
        name:"這個(gè)是主進(jìn)程傳遞過來的",
        value:1
      }
    ])
    e.sender.send(IpcEvents.SAYWORLD,world)
  })
  //這個(gè)便是進(jìn)行的雙向通信說謝謝
  ipcMain.handle(IpcEvents.SAYTHANKYOU,()=>{
    return '謝謝'
  })
}

export default {register}

electron-vite中的ipc通信,electron,javascript,前端

我們可以看見非常的有禮貌,那你呢?

值得注意的是:

  • 以上操作我們都是在electron-vite的腳手架下完成的,electron-vite已經(jīng)完成了文件預(yù)加載的任務(wù)(也就是說已經(jīng)把electron的對(duì)象綁定到了window對(duì)象上)
  • 如果您自己搭建electron那么需要自己創(chuàng)建預(yù)加載文件。
  • 還有另外一種情況就是,我們此預(yù)加載文件是在主窗口下引入,如果新打開窗口不是主窗口那么需要在新打開窗口中重新引入預(yù)加載文件,否則Ipc通信不可使用

為了解決紅色方框的第三個(gè)問題,以示誠(chéng)意貼張圖片

electron-vite中的ipc通信,electron,javascript,前端

以上便是完整的ipc通信,說謝謝

?

到了這里,關(guān)于electron-vite中的ipc通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • vite + electron 構(gòu)建前端桌面應(yīng)用程序

    vite + electron 構(gòu)建前端桌面應(yīng)用程序

    npm yarn 選擇是否繼續(xù) 項(xiàng)目名稱 選擇框架 選擇項(xiàng)目語言 項(xiàng)目構(gòu)建成功,根據(jù)提示進(jìn)入項(xiàng)目目錄,安裝依賴 electron 官網(wǎng):https://www.electronjs.org/zh/docs/latest/ vite-plugin-electron :https://github.com/electron-vite/vite-plugin-electron 安裝依賴(electron 安裝比較慢,耐心等待即可) 編寫 Electron 入

    2024年02月06日
    瀏覽(19)
  • 使用vue3+vite+elctron構(gòu)建小項(xiàng)目介紹Electron進(jìn)程間通信

    使用vue3+vite+elctron構(gòu)建小項(xiàng)目介紹Electron進(jìn)程間通信

    進(jìn)程間通信 (IPC) 是在 Electron 中構(gòu)建功能豐富的桌面應(yīng)用程序的關(guān)鍵部分之一。 由于主進(jìn)程和渲染器進(jìn)程在 Electron 的進(jìn)程模型具有不同的職責(zé),因此 IPC 是執(zhí)行許多常見任務(wù)的唯一方法,例如從 UI 調(diào)用原生 API 或從原生菜單觸發(fā) Web 內(nèi)容的更改。 在 Electron 中,進(jìn)程使用 ipcM

    2024年02月06日
    瀏覽(97)
  • 銀河麒麟v10安裝前端環(huán)境(Node、vue、Electron+vite)

    銀河麒麟v10安裝前端環(huán)境(Node、vue、Electron+vite)

    此帖子所提到的所有依賴包都是基于銀河麒麟v10真機(jī)的arm架構(gòu)包,如果是在windows上的虛擬機(jī)上 把依賴包換成x64的包即可,方法步驟都是一樣 一.node安裝 原始方法安裝(建議用第二種nvm方法,因?yàn)楦?jiǎn)單): 1.1nodejs官網(wǎng)下載基于arm架構(gòu)的包 1.1.1或者打開終端使用wget方式安裝

    2024年02月02日
    瀏覽(51)
  • electron+Vue3構(gòu)建桌面應(yīng)用之IPC通訊

    最近在做一個(gè)C/S架構(gòu)的項(xiàng)目預(yù)研 過程中遇到 Electron 與 Vue3 通訊的問題,費(fèi)勁巴力的在網(wǎng)上找方案,發(fā)現(xiàn)都不理想,最終攻克之后,計(jì)劃將過程寫下來,供有需求的同學(xué)白嫖! 開始之前,先說一件重要的事情: 看文檔 看官方文檔 一定要看官方文檔 好,言歸正傳。 先說需求

    2024年04月29日
    瀏覽(22)
  • 前端2023最全面試題(javaScript、typeScript、vue2、vue3、html、css、uniapp、webpack、vite、react)

    答案:JavaScript中的閉包是一種函數(shù),它有權(quán)訪問其詞法環(huán)境的變量和其它函數(shù)。這意味著,即使其包含它的函數(shù)已經(jīng)執(zhí)行完畢,其詞法環(huán)境仍然存在,因此可以訪問其作用域內(nèi)的變量。 答案:回調(diào)函數(shù)是在某個(gè)特定事件之后執(zhí)行的函數(shù)。在JavaScript中,通常使用回調(diào)函數(shù)來處

    2024年02月06日
    瀏覽(34)
  • 【IPC通信--共享內(nèi)存】

    【IPC通信--共享內(nèi)存】

    數(shù)據(jù)傳輸:一個(gè)進(jìn)程需要將它的數(shù)據(jù)發(fā)送給另一個(gè)進(jìn)程 資源共享:多個(gè)進(jìn)程之間共享同樣的資源。 通知事件:一個(gè)進(jìn)程需要向另一個(gè)或一組進(jìn)程發(fā)送消息,通知它(它們)發(fā)生了某種事件(如進(jìn)程終止時(shí)要通知父進(jìn)程)。 進(jìn)程控制:有些進(jìn)程希望完全控制另一個(gè)進(jìn)程的執(zhí)行

    2024年01月16日
    瀏覽(20)
  • 環(huán)境編程代碼實(shí)例:進(jìn)程間通信(IPC)

    環(huán)境編程代碼實(shí)例:進(jìn)程間通信(IPC)。 yezhening/Environment-and-network-programming-examples: 環(huán)境和網(wǎng)絡(luò)編程實(shí)例 (github.com) Environment-and-network-programming-examples: 環(huán)境和網(wǎng)絡(luò)編程實(shí)例 (gitee.com) 低級(jí):3種 全局變量/glov:類似管道、命名管道、消息隊(duì)列、共享內(nèi)存:頭文件/庫(kù)文件全局變量

    2024年02月05日
    瀏覽(26)
  • system-v IPC共享內(nèi)存通信

    system-v IPC共享內(nèi)存通信

    目錄 system v IPC簡(jiǎn)介 共享內(nèi)存需要用到的函數(shù)接口 shmget函數(shù)--獲取對(duì)象ID shmat函數(shù)--獲得映射空間 shmctl函數(shù)--釋放資源 共享內(nèi)存實(shí)現(xiàn)思路 注意 消息隊(duì)列、共享內(nèi)存和信號(hào)量統(tǒng)稱為system v IPC(進(jìn)程間通信機(jī)制),V是羅馬數(shù)字5,是UNIX的ATT分支的其中一個(gè)版本,一般稱它們?yōu)镮PC對(duì)象

    2024年04月26日
    瀏覽(22)
  • 【IPC通信--socket套接字--心跳包】

    隨著網(wǎng)絡(luò)通信技術(shù)的不斷發(fā)展,網(wǎng)絡(luò)通信已成為我們?nèi)粘9ぷ骱蜕钪胁豢苫蛉钡囊徊糠帧5窃谑褂镁W(wǎng)絡(luò)通信的過程中,時(shí)常會(huì)遇到網(wǎng)絡(luò)延遲、丟包等問題,這些問題不僅影響我們的工作和生活效率,也會(huì)給我們的網(wǎng)絡(luò)帶來一定的風(fēng)險(xiǎn)和安全隱患。為了解決這些問題,Soc

    2024年01月22日
    瀏覽(18)
  • vite配置electron、ElementPlus或者AntDesignVue

    這是全部的配置原文: 就暫時(shí)不描述,只可意會(huì)不可言傳了。

    2024年02月11日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包