ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

VueUse Electron useIpcRenderer 使用指南:将 Electron ipcRenderer 全部 API 转化为 Vue 响应式组合式函数

VueUse Electron useIpcRenderer 使用指南:将 Electron ipcRenderer 全部 API 转化为 Vue 响应式组合式函数 前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载useIpcRenderer是 VueUse 的 Electron 插件包vueuse/electron提供的核心组合式函数它把 Electron 渲染进程的ipcRenderer模块及其全部常用 API 封装为符合 Vue Composition API 风格的响应式接口事件监听自动随组件卸载移除异步invoke与同步sendSync的返回值被包装为ShallowRef让主进程与渲染进程之间的通信在 Vue 组件中像本地状态一样自然。读完本文你将掌握useIpcRenderer的完整用法、响应式返回值原理以及如何在不开启nodeIntegration的安全场景下显式注入ipcRenderer。为什么需要 useIpcRendererElectron 渲染进程通过ipcRenderer与主进程进行进程间通信IPC。原生用法有两个与 Vue 组件模型格格不入的痛点异步操作割裂ipcRenderer.invoke()返回 Promise需要手动then或在async函数中await与模板中的响应式状态脱节监听器泄漏ipcRenderer.on()注册的监听器在组件卸载后不会自动移除容易造成内存泄漏与重复回调。useIpcRenderer正是为解决这两点而生。从 packages/electron/index.ts 可以看到vueuse/electron导出五个函数useIpcRenderer、useIpcRendererInvoke、useIpcRendererOn、useZoomFactor、useZoomLevel。其中useIpcRenderer是聚合入口内部复用了另外两个组合式函数来提供响应式能力。安装与环境要求vueuse/electron是 VueUse 的独立插件包需与electron、vue一同安装npm i vueuse/electron electron根据 packages/electron/package.json 的声明peerDependencieselectron 9.0.0、vue ^3.5.0本项目版本为 15.0.0sideEffects: false适合 tree-shaking内部依赖vueuse/shared用于tryOnScopeDispose等生命周期工具engines.node 22。使用前提useIpcRenderer的底层实现依赖渲染进程能访问window.require(electron)因此要么在创建 BrowserWindow 时开启nodeIntegration要么显式传入ipcRenderer实例见下文自定义 IpcRenderer一节。基本用法一行代码拿到响应式 ipcRenderer在渲染进程的 Vue 组件中直接调用即可import { useIpcRenderer } from vueuse/electron import { computed } from vue // 需要开启 nodeIntegration或者显式传入 ipcRenderer const ipcRenderer useIpcRenderer() // invoke 的结果是 ShallowRef可直接参与响应式计算 const result ipcRenderer.invokestring(custom-channel, some data) const msg computed(() result.value?.msg) // 事件监听在组件卸载时自动移除 ipcRenderer.on(custom-event, (event, ...args) { console.log(args) })这段代码展示了两大核心体验ipcRenderer.invoke(custom-channel, some data)不再返回 Promise而是返回一个ShallowRefT | null初始值为null主进程响应到达后自动填充。由于它是 refcomputed(() result.value?.msg)可以直接基于它做派生计算模板中也能像使用本地状态一样直接渲染result。ipcRenderer.on(...)注册的监听器通过tryOnScopeDispose在组件卸载或当前作用域销毁时自动调用removeListener清理无需手动维护清理逻辑。响应式返回值invoke 与 sendSync 的底层原理useIpcRenderer返回对象中invoke与sendSync被特意改造为返回ShallowRef。对照源码 packages/electron/useIpcRenderer/index.tsinvoke委托给useIpcRendererInvoke。在其实现 packages/electron/useIpcRendererInvoke/index.ts 中先创建一个shallowRefT | null(null)再调用原生ipcRenderer.invoke(channel, ...invokeArgs)待 Promise resolve 后将响应写入result.value最后把 ref 返回给调用方。用注释中的话说是让异步操作看起来像同步的makes asynchronous operations look like synchronous。sendSync由内部setSendSync函数实现packages/electron/useIpcRenderer/index.ts由于ipcRenderer.sendSync本身是同步阻塞返回直接result.value ipcRenderer.sendSync(channel, ...args)即可同样包装为ShallowRefT | null返回。注意两点设计细节返回类型均为ShallowRefT | nullT由泛型指定如invokestring读取时需自行处理null初始态即Ref result will return的含义使用shallowRef而非ref意味着只有最外层.value的替换会触发响应内部深层的可变状态不会触发更新——这是为 IPC 结果这种整块返回、整块替换的数据形态所做的性能取舍。可用方法一览useIpcRenderer返回的对象拥有与原生ipcRenderer一致的常用方法集差异在于invoke/sendSync的返回类型已改造为ShallowRef方法说明on(channel, listener)监听 channel组件卸载时自动移除监听器once(channel, listener)只监听一次消息到达后自动移除removeListener(channel, listener)移除指定监听器removeAllListeners(channel)移除该 channel 上的全部监听器send(channel, ...args)向主进程发送异步消息不等待响应invoke(channel, ...args)发送消息返回ShallowRef形式的响应结果sendSync(channel, ...args)发送同步消息返回ShallowRef形式的响应结果postMessage(channel, message, transfer?)发送消息可附带可转移transferable的MessagePort[]对象sendTo(webContentsId, channel, ...args)向指定webContentsId的窗口发送消息sendToHost(channel, ...args)向宿主页面的webview元素发送消息而非主进程监听器的签名是(event: IpcRendererEvent, ...args: any[]) void该类型定义在 packages/electron/_types.ts 中与 Electron 官方ipcRenderer.on回调一致event参数携带sender、senderId等上下文信息。其中on的完整实现见 packages/electron/useIpcRendererOn/index.ts注册前先用tryOnScopeDispose(() ipcRenderer!.removeListener(channel, listener))登记清理钩子再调用原生ipcRenderer.on(channel, listener)并返回IpcRenderer实例。这就是组件卸载自动移除监听器的实现依据——它由 Vue 的当前 effect scope 驱动而非依赖 Electron 的窗口生命周期。自定义 IpcRenderer在关闭 nodeIntegration 的安全模式下使用出于安全最佳实践许多应用会关闭webPreferences.nodeIntegration并启用contextIsolation。此时window.require不可用useIpcRenderer()的无参调用会失败——源码 packages/electron/useIpcRenderer/index.ts 会抛出provide IpcRenderer module or enable nodeIntegration错误。解决方案是显式传入ipcRenderer实例import { useIpcRenderer } from vueuse/electron import { ipcRenderer } from electron const ipc useIpcRenderer(ipcRenderer)参数类型为 Electron 的IpcRenderer接口传入后返回对象中的所有方法都会绑定到该实例上。常见的工程化做法是在 preload 脚本中通过contextBridge把ipcRenderer的安全子集暴露给渲染进程或在渲染进程中使用import { ipcRenderer } from electron需要构建工具支持且模块加载环境允许访问 Node 能力若你使用的是打包后的 renderer 产物也可通过window.require(electron)在nodeIntegration开启时自动获取无参调用时的默认路径见 packages/electron/useIpcRenderer/index.ts。主进程配套要点useIpcRenderer只覆盖渲染进程一侧通信对端需要在主进程中使用ipcMain相应方法配合invoke(channel, ...)对应用主进程的ipcMain.handle(channel, handler)send(channel, ...)对应ipcMain.on(channel, handler)sendSync(channel, ...)对应ipcMain.on(channel, (event) event.returnValue ...)。在渲染进程侧useIpcRendererInvoke与useIpcRendererOn也可单独从vueuse/electron导入packages/electron/index.ts 中已全部导出分别提供响应式 invoke与自动清理监听的单项能力适合不需要整套 API 的场景。与其他模块的分工vueuse/electron包packages/electron/README.md共提供 5 个组合式函数除本文主角useIpcRenderer外还有独立的useIpcRendererInvoke响应式ipcRenderer.invoke结果、useIpcRendererOn自动清理的监听、useZoomFactor与useZoomLevel响应式 WebFrame 缩放。useIpcRenderer是面向完整 IPC 通信需求的聚合入口其余函数则是按需取用的原子能力可根据组件实际职责选择使用。赞分享前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载相关推荐如何把智慧教育平台的电子课本存到本地一款免费批量下载工具的完整走法如何把智慧教育平台的电子课本存到本地一款免费批量下载工具的完整走法 学期初要把一学期要用的教材存到本地可平台上的预览页只给你看图找不到下载 PDF的入网页爬虫教育VueUse vueuse/math useMin响应式 Math.min 组合式函数完全指南VueUse vueuse/math useMin响应式 Math.min 组合式函数完全指南 useMin 是 VueUse vueuse/math 扩前端airi 项目实践指南用 VueUse useFuse 组合式函数为 Vue 应用构建响应式模糊搜索airi 项目实践指南用 VueUse useFuse 组合式函数为 Vue 应用构建响应式模糊搜索 useFuse 是 VueUse vueuse/intAI 应用人工智能大模型数字人AI Agent语音前端后端桌面应用移动开发即时通讯3D渲染上一篇CodeQwen1.5 离线部署无网络环境下从下载模型到跑通推理的完整指南下一篇解密Spotify音乐离线化突破流媒体限制的技术重构创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表