【electron】ipc模块使用

20pzqm
• 阅读 1115

electron 进程模型

上篇帖子传送门——vue+electron 环境搭建记录(基于vue-cli-plugin-electron-builder)

electron 使用多进程架构

与chromium类似,electron使用多进程架构。单一进程架构能够节省资源,然而浏览器经常遇到恶意代码,可能导致进程崩溃,浏览器的多个页签公用一个进程必然会一损俱损,因此多进程架构更适合些(chromium多进程架构说明)。 【electron】ipc模块使用 在开发electron的过程中,我们主要接触两个进程: 主进程main process与渲染进程renderer process

主进程

每个electron 应用只有一个主进程, 对应于vcp-electron-builder搭建的项目里的background.js脚本.

主进程代码, 拥有能访问nodejs api的能力,可以require nodejs 的模块, 调用一些原生模块来与操作系统交互. 主进程负责管理electron应用的生命周期, 管理应用的窗口, 可以通过IPC模块来与渲染进程交互.

渲染进程

渲染进程就是负责渲染网页内容的, 网页html,css以及网页相关的js就跑在这里.

由于渲染进程不能用commonjs模块(至少默认不可以), 渲染进程不能用require来引入nodejs模块.(此处涉及到一些浏览器使用异步加载,因此不能用commonjs模块同步加载的原因,以后单开帖子记录)

渲染进程如果需要使用某些通过nodejs原生模块才能完成的工作(例如读取磁盘文件), 就需要用IPC来完成.

electron IPC使用

概述

官网讲的已经非常好了... electron IPC 进程间通信

实践

前提 上一帖搭建的环境

https://github.com/NightsLight-hub/vcped-test.git
tag:  0-initenv

目标

  • 主进程启动httpserver,将rest的pathVariable作为查询关键词发送渲染进程, 用span展示

1. 配置preload,暴露IpcRenderer给window对象

由于Electron的上下文隔离,我们需要利用contextBridge来将IpcRender暴露到渲染进程.

在vue.config.js中新增如下内容,参考

 module.exports = {
  pluginOptions: {
    electronBuilder: {
      nodeIntegration: false,
      preload: 'src/preload.js'
    }
  }
};

在src(background.js同级目录)中新建preload.js

import { contextBridge, ipcRenderer } from 'electron';

contextBridge.exposeInMainWorld('ipcRenderer', {
  send: (channel, data) => {
    ipcRenderer.send(channel, data);
  },
  receive: (channel, func) => {
    ipcRenderer.on(channel, (event, ...args) => func(event, ...args));
  },
  invoke: (channel, func, ...args) => {
    ipcRenderer.invoke(channel, ...args).then((result) => {
      func(result);
    });
  }
});

在background.js,主窗口的webPreferences中增加preload 配置

const browserWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {

      // Use pluginOptions.nodeIntegration, leave this alone
      // See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more info
      nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION,
      contextIsolation: !process.env.ELECTRON_NODE_INTEGRATION,
      preload: path.join(__dirname, 'preload.js')  // 增加preload配置
    }
  });

在渲染进程中用IpcRenderer来 修改home.vue, mounted 钩子中,用ipcRenderer来获取mainMsg的消息

<template>
  <div class="home">
    <span>{{ msg }}</span>
  </div>
</template>

<script>
// @ is an alias to /src

export default {
  name: 'Home',
  data () {
    return {
      msg: ''  
    };
  },
  mounted () {
    // eslint-disable-next-line no-debugger
    debugger;
    window.ipcRenderer.receive('mainMsg', (event, ...args) => {
      console.log('get mainMsg');
      this.msg = args[0];   // msg 使用ipcrenderer的消息赋值
    });
  }
};

2. express监听20300端口,使用webcontents 发送消息到'search'通道

background.js 增加express 监听

const express = require('express');
...
async function createWindow () {
  // Create the browser window.
  const browserWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {

      // Use pluginOptions.nodeIntegration, leave this alone
      // See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more info
      nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION,
      contextIsolation: !process.env.ELECTRON_NODE_INTEGRATION
    }
  });
  startExpress(browserWindow);
  ...
}

function startExpress (browserWindow) {
  const arserver = express();
  arserver.get('/api/search/:word', (req, res) => {
    console.log(req.params.word);
    // 使用主窗口的webContents来做进程通信,发送信息
    browserWindow.webContents.send('search', req.params.word);
    res.send('ok');
  });
}

启动调试

yarn electron:serve

使用命令行发送

curl 127.0.0.1:20300/api/msg/123

应用界面变化 【electron】ipc模块使用

本节代码可以从github获取

https://github.com/NightsLight-hub/vcped-test
tag:1-ipc
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
2年前
4、jstack查看线程栈信息
1、介绍利用jps、top、jstack命令找到进程中耗时最大的线程,以及线程状态等等,同时最后还可以显示出死锁的线程查找:FoundoneJavaleveldeadlock即可1、jps获得进程号!(https://oscimg.oschina.net/oscnet/da00a309fa6
Wesley13 Wesley13
2年前
Android中的IPC通信(一)
IPC的概念  IPC:InterProcessCommunication,进程间通信。  短程通信:一般而言,应用程序的组件都是在一个进程内部里执行,这种在同一进程内的通信就称为短程通信。  远程通信:两个组件分别在不同的进程里执行,这种不同进程间组件的通信方式就被称为远程通信。IPC通信的效率
Stella981 Stella981
2年前
PostgreSQL死锁进程及慢查询处理
1、死锁进程查看:SELECTFROMpg_stat_activityWHEREdatname'数据库名称'andwaitingtrue;pid进程id。2、慢查询SQL:selectdatname,pid,usename,application_name,client_addr,client
Wesley13 Wesley13
2年前
Java多线程系列(1)
本章主要内容有:1.线程进程的区别2.线程的生命周期3.Java内存模型原子性,可见性及有序性4.线程池及Java实现1.线程进程的区别线程:程序运行的最小单位进程:资源分配的最小单位一个进程可以有多个线程,多个线程共享进程里面的数据线程间通讯相对更加方便,进程间通讯需要通过IPC(
Wesley13 Wesley13
2年前
mysql操作中卡死 解决方法
1.使用指令查询当前进程showfullprocesslist;查询全部当前进程;showprocesslist;只列出前100条2.找出卡死的进程id3.删除卡死进程kill99;99为卡死id4.其他状态含义showstatus;Ab
Stella981 Stella981
2年前
Nginx
!(https://imagestatic.segmentfault.com/255/117/25511790966008dc5b00fd8)Nginx进程模型分析在介绍Nginx的进程模型之前我们先来给大家解释下一些常见的名词,这能辅助我们更好的了解Nginx的进程模型。作为Web服务器,设计的初衷就是为了能够处理更多的客户端的请
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这