使用electron进行原生应用的打包(2)---主进程与渲染进程之间的通信

上一篇讲了使用electron进行打包的配置相关文件,这篇主要讲electron中很重要的通信方式.

首先解释一个概念: electron打包的应用包含两个部分

  • electron的环境(node),也就是主进程.
  • web渲染环境,副进程.

这两个环境之间是相互隔离的,无法直接进行数据通信,所以有了这篇文章.

三个角色:

  • ipcRender
  • ipcMain
  • webContents

ipcRenderer用于渲染进程

  • ipcRenderer.on(channel, listener) --> channel为事件频道,字符串.listener为触发回调函数,用于响应webContent.send()
  • ipcRenderer.send(channel, data) --> 概念同上,用于向ipcMain发送异步信息.
  • ipcRenderer.sendSync(channel, data) --> 用于向ipcMain发送同步信息,此时会阻塞掉渲染进程,除非必须,谨慎使用.

ipcMain用于主进程,响应从渲染进程中发送的消息

  • ipcMain.on(channel,listener) --> 响应从ipcRender中相同channel.
  • ipcMain.once(channel,listener) --> 同上,但是只触发一次,触发后自动取消绑定
  • ipcMain.removeListener(channel,listener) --> 移除时事件,listener一定要为函数引用,不能是匿名函数或箭头函数,否则不能解绑
  • ipcMain.removeAllListener([channel]) --> 移除channel上的所有事件
  • listener (event, data)

    • event.sender.send(channel, data) --> 这是唯一ipcMain可以异步返回消息的方法,通过event参数向渲染进程发送消息.(与ipcRenderer.send对应)
    • event.returnValue(channel,data) --> ipcMain同步返回消息(与ipcRenderer.sendSync对应)
    • data是消息发送者携带的data

最后一个是webContent

不知道细心的读者有没有发现,ipcMain本身是无法直接发送事件的,只能通过响应事件回调的event来发送,那如果我们想先让主进程发送消息呢?那就才用这个办法.这个webcontent是在BrowserWIndow实例中的方法

  • webContent.send(channel,data) --> 主进程向渲染进程发送消息.

注意,这些方法全部需要在主进程已经创建了BrowserWindow之后才有效,下面来一个例子:

在关闭客户端之前需要判断已修改的文件已保存.下图为流程图:

首先是渲染端代码: 

const electron = require(‘electron‘) // 引入electron
const ipcRenderer = electron.ipcRenderer; // 获取ipcRender渲染进程
let to_close = false // 定义允许关闭变量

ipcRenderer.on(‘save_complete‘, () => to_close = true) // 如果保存完成则设置为可以关闭

ipcRenderer.on(‘not_save‘, () => to_close = false) // 否则设置为不可关闭

// 全局的点击关闭按钮后调用
window.onbeforeunload = (e) => {
  !to_close && (e.returnValue = false) // 如果不允许关闭则return false阻止关闭
  ipcRenderer.send(‘need_close‘) // 发送需要进行关闭信息
}

其次是主进程代码

const electron = require(‘electron‘)
const app = electron.app
const dialog = electron.dialog // 创建对话框
const BrowserWindow = electron.BrowserWindow
const ipcMain = electron.ipcMain

let need_close = false // 是否需要关闭(如果只是点击保存则不需要关闭)

ipcMain.on(‘need_close‘, () => need_close = true) // 如果需要,则设为true

// 当点击保存时
mainWindow.webContents.session.on(‘will-download‘, (event, downloadItem,webContents) => {
  // 阻止默认保存行为(点击a标签)
  event.returnValue = false;
  // 显示保存对话框,默认扩展为.txt
  const fileName = dialog.showSaveDialog({
    defaultPath: ‘新的作品‘,
    filters: [
      { name: ‘txt‘, extensions: [‘txt‘] }],
  });
  // 如果没有正常保存
  if (typeof fileName == ‘undefined‘) {
    // 不能退出
    need_close = false
    // 向渲染端发送没有保存消息
    webContents.send(‘not_save‘)
    // 取消下载
    return downloadItem.cancel();
  }
  // 正常下载
  downloadItem.setSavePath(fileName);
  // 当下载项结束时
  downloadItem.on(‘done‘, (event, state) => {
    // 有三种state completed, cancelled, interrupted,此处只监听完成时
    if (state === ‘completed‘) {
      // 发送完成保存
      webContents.send(‘save_complete‘)
      // 如果需要关闭的话则退出app
      need_close && app.quit();
    }
  });
})

这是很简单的展示了如何在渲染端以及服务端进行消息传递.可以基本满足通信需求.

原文地址:https://www.cnblogs.com/BigJ/p/electron2.html

时间: 2024-10-09 20:24:45

使用electron进行原生应用的打包(2)---主进程与渲染进程之间的通信的相关文章

使用electron进行原生应用的打包

因为信奉一句话:JavaScript 终将一统天下,所以要想方设法开疆扩土. 今天介绍的这个electron就是一大神器,可以很方便的将网页应用打包为Mac, Win, Linux下的可执行文件,只需进行简单的配置,虽比不上原生的速度和瘦小,但是性价比着实不错. 一 在package.json中指明对应版本,(electron和electron-builder需放在devDependencies中),使用yarn添加模块 { "name": "electron_example

Electron – 基础学习(2): 项目打包成exe桌面应用

项目创建完成,启动正常,接下来就是项目打包了.将测试Demo打包成exe桌面应用,点击exe文件,运行项目. 书接上文,创建项目有三种方式 Git拷贝.直接创建.通过electron社群提供的命令行工具(CLI)  electron-forge 创建项目,看起来对应的项目打包方式也应该有三种才对,但其实细看第一种方式和第三种项目创建方式是一样的,所以它们的项目打包方式也是一样的. 打包 electron 项目webpack工具有 electron-packager 和 electron-buil

Electron – 项目报错整理(打包~2): electron-packager踩坑

原文地址:https://www.cnblogs.com/donghuang/p/12271556.html

python实战之原生爬虫(爬取熊猫主播排行榜)

""" this is a module,多行注释 """ import re from urllib import request # BeautifulSoup:解析数据结构 推荐库 Scrapy:爬虫框架 #爬虫,反爬虫,反反爬虫 #ip 封 #代理ip库 class Spider(): url='https://www.panda.tv/cate/lol' root_pattern='<div class="video-i

electron 大体结构

1.Electron支持的平台: OS XWindowsLinux 2.一个标准的electron app包含的结构: Windows 或是 Linux中:electron/resources/app|_package.json|_main.js|_index.html 3.electron程序打包: 一般使用asar来进行打包,electron中一般包含两种API:Node.js和Chromium提供的Web APINode API如fs.readFile 4.使用Native Node模块

用全栈神器electron 打全平台桌面级 app--Music Player

什么是Electron? Electron 技术方案进行桌面端的开发,跨平台兼容 macOS.Windows.Linux 等操作系统.可以让你写使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序. 快速入门 Electron 可以让你使用纯 JavaScript 调用丰富的原生 APIs 来创造桌面应用.你可以把它看作一个专注于桌面应用的 Node.js 的变体,而不是 Web 服务器. 这不意味着 Electron 是绑定了 GUI 库的 JavaScript.相反,E

Electron Angular 开发小记

一介绍 electron分为主进程和渲染进程,主进程负责和原生交互,控制窗口等. 渲染进程就是普通网页.主进程和渲染进程可以通过ipcMain(主进程使用)及ipcRenderer(渲染进程用)通信 quick-start中main.js为主进程入口文件 index.html为渲染进程入口文件 另外很重要的一点使用electron没有跨域限制!!! 二 打包 1.快速运行quick-start(开发时启动) git clone https://github.com/electron/electr

Electron 安装和使用(三)-- 发声器electron进程间的通信

用远程事件从浏览器窗口关闭应用 请切换到02-basic-sound-machine这个tag: git checkout 02-basic-sound-machine 简要重述–应用窗口(更准确的说是渲染进程)应该不能与GUI(用来关闭窗口)通信的,官方的Electron快速入门指南写到: 在web页面,不允许调用原生GUI相关的API,因为在web页面管理原生GUI资源是很危险的,会很容易泄露资源.如果你想在web页面施行GUI操作,web页面的渲染进程必须要与主进程通信,请求主进程来完成这

快速了解Electron:新一代基于Web的跨平台桌面技术

本文引用了作者“ ConardLi”的<用JS开发跨平台桌面应用,从原理到实践>一文部分内容,原文链接:segmentfault.com/a/1190000019426512,感谢原作者的无私分享. 1.引言 现在开发IM应用动不动就要求多端——即Android端.iOS端.PC端.Web端等,Android端和iOS端作为两种不同的移动端技术,单独开发和维护还能理解,PC端和Web端如果要单独开发那就有点头大了,必竟开发传统的PC桌面应用成本太高(QT这类技术跟Web技术相比,上手难度大的多