如何新建一个 Electron 项目?

electron快速入门笔记: https://www.jianshu.com/p/f134878af30f

然后自己新建一个 Electron 项目,在项目中输出 Hello World!

Electron 的背景信息

搭建完这个 Electron 项目后,相信大家对 Electron 已经有了初步的认知,接下来我们可以查看文档来获取 Electron 更多的背景信息: https://electronjs.org/docs/tutorial/about

我们知道 Electron 使用了 Chromium 的渲染库,我们可以把它看作一个精简版的 Chromium 浏览器。

Electron 里,存在一个 主进程 和一个 渲染进程,我们可以在下文中看到 主进程 和 渲染进程 的区别: https://www.w3cschool.cn/electronmanual/p9al1qkx.html

当我们运行一个 Electron 客户端时,客户端窗口是如何打开的?

这部分内容前面的几篇文章里也有,比较重要,这里单独拿出来再说一下:

我们在 package.json 中可以找到 "main" 属性,一般为 {"main": "./main"};

这里我们就是启动了 主进程 main.js, 我们打开 main.js 文件, 可以看到如下代码:

  1. const { app, BrowserWindow } = require('electron');
  2. const path = require('path');
  3. const url = require('url');
  4.  
  5. let window;
  6.  
  7. function createWindow() {
  8. window = new BrowserWindow({ width: 1200, height: 900 });
  9.  
  10. window.loadURL(url.format({
  11. pathname: path.join(__dirname, './index.html'),
  12. protocol: 'file:',
  13. slashes: true
  14. }));
  15.  
  16. // 打开调试工具.
  17. window.webContents.openDevTools();
  18.  
  19. // 当 window 关闭时触发.
  20. window.on('closed', () => {
  21. window = null
  22. })
  23. }
  24.  
  25. // 'ready' 后开始 createWindow
  26. app.on('ready', createWindow);
  27.  
  28. // Quit when all windows are closed.
  29. app.on('window-all-closed', () => {
  30. // On macOS it is common for applications and their menu bar
  31. // to stay active until the user quits explicitly with Cmd + Q
  32. if (process.platform !== 'darwin') {
  33. app.quit();
  34. }
  35. });
  36.  
  37. app.on('activate', () => {
  38. // On macOS it's common to re-create a window in the app when the
  39. // dock icon is clicked and there are no other windows open.
  40. if (window === null) {
  41. createWindow();
  42. }
  43. });

我们可以看到这个文件中有一些 app.on 来接收事件,当 app.on('ready', createWindow) 时,我们调用了 createWindow 函数;在 createWindow 函数中创建了 new BrowserWindow, 然后进入了 ./index.html 文件。

备注:我们可以在这个文档中查到更多的事件: https://electronjs.org/docs/api/app

回到我们的 小班教室 和 1vN 客户端,我们来简单介绍下我们用到的一些 事件:

  1. 'ready': Electron 完成初始化时被触发。
  2. 'open-url': 当用户想要在应用中打开一个 URL 时发出。
  3. 'activate': 当应用被激活时发出。
  4. 'before-quit': 在应用程序开始关闭窗口之前触发。
  5. 'window-all-closed': 当所有的窗口都被关闭时触发。

主进程(main)和渲染进程(renderer)间的通信

在 项目开发中,我们总会有时候,需要在 main 和 renderer 之间进行通信,Electron 提供了相应的通信方法:

ipcMain: https://electronjs.org/docs/api/ipc-main#ipcmain
ipcRenderer: https://electronjs.org/docs/api/ipc-renderer#ipcrenderer

在我们的客户端中,引入了 'electron-ipc' 库,使得通信方法更加简单:

  1. const ipcp = require('electron-ipc');
  2.  
  3. // 发送
  4. ipcp.publish('msgName', 'sendInfo');
  5.  
  6. // 接收
  7. ipcp.subscribe('msgName', (msg) => {
  8. console.log('msg', msg) // 'msg' 'sendInfo'
  9. })

其中 'msgName' 是通道名(channel)。

如果我们想要在 subscribe 接收到消息之后再在 publish 的地方做出相关处理,则可以采用如下方式:

  1. const ipcp = require('electron-ipc');
  2.  
  3. // 发送
  4. ipcp.publish('msgName', 'sendInfo').then((res) => {
  5. console.log('res', res) // 'res' 'msg has been accepted'
  6. });
  7.  
  8. // 接收
  9. ipcp.subscribe('msgName', (msg) => {
  10. console.log('msg', msg) // 'msg' 'sendInfo'
  11. return 'msg has been accepted'
  12. })

这个依赖库让我们使用 ipc 通信更加简单,无需再考虑 main 和 renderer 的不同写法。具体实现逻辑可以查看源码,,源码中实际上只是做了一丢丢判断:

  1. const IS_RENDERER = typeof window !== 'undefined' && window.process && window.process.type === 'renderer'
  2. const TARGET = IS_RENDERER ? electron.ipcRenderer : electron.ipcMain
  3.  
  4. 本篇来自于他人总结哦!

electron客户端开发的更多相关文章

  1. Electron+Vue开发跨平台桌面应用

    Electron+Vue开发跨平台桌面应用 xiangzhihong发布于 2019-12-23 虽然B/S是目前开发的主流,但是C/S仍然有很大的市场需求.受限于浏览器的沙盒限制,网页应用无法满足某 ...

  2. C#.NET 大型通用信息化系统集成快速开发平台 4.0 版本 - 多系统开发接口 - 苹果客户端开发接口

    最近工作上需要,给苹果客户端开发接口,实现集中统一的用户管理,下面是接口调用参考. 1: 获取OpenId? http://127.0.0.1/GetOpenId.ashx?username=Admi ...

  3. 在线教学、视频会议 Webus Fox(3) 客户端开发手册

    本文主要介绍webus fox 客户端的配置及接口说明. 1. 文件列表和配置 1.1 文件列表 1.2 common.xml 配置 根据服务器端的部署, 替换[ServerUrl] , [RtmpP ...

  4. [原创]上海好买基金招高级Java技术经理/运维主管/高级无线客户端开发等职位(内推)

    [原创]上海好买基金招高级Java技术经理/运维主管/高级无线客户端开发等职位(内推) 内部推荐职位 高级JAVA技术经理: 岗位职责: 负责项目管理(技术方向),按照产品开发流 ,带领研发团队,制定 ...

  5. iOS客户端开发与Web前端开发

    转载自:http://blog.cnbang.net/tech/1813/不知不觉做iOS客户端开发已经半年多了,了解到iOS客户端开发与Web前端开发的一些异同,写一下. 版本升级.用户角度上看,客 ...

  6. 基于Android的小巫新闻客户端开发系列教程

    <ignore_js_op> 141224c6n6x7wmu1aacap7.jpg (27.51 KB, 下载次数: 0) 下载附件  保存到相册 23 秒前 上传   <ignor ...

  7. ASP.NET5之客户端开发:Grunt和Gulp构建工具在Visual Studio 2015中的高效的应用

    Grunt和Gulp是Javascript世界里的用来做自动压缩.Typescript编译.代码质量lint工具.css预处理器的构建工具,它帮助开发者处理客户端开发中的一些烦操重复性的工作.Grun ...

  8. [转] electron实战开发详细流程

    [From] http://www.myk3.com/arc-8856.html 很久没有更新博客,人越来越懒了,唉 说好做的electron教程距离上次玩electron已经过去了好几个月了.. 这 ...

  9. 用Jersey为Android客户端开发Restful Web Service

    平时在做Android客户端的时候经常要与服务器之间通信,客户端通过服务端提供的接口获取数据,然后再展示在客户端的界面上,作为Android开发者,我们平时更多的是关注客户端的开发,而对服务端开发的关 ...

随机推荐

  1. 2018-2019-2 (内附jdk与webgoat完整安装教程)《网络对抗技术》Exp9 Web安全基础 Week13 20165233

    Exp9 Web安全基础 目录 一.基础问题 二.实验步骤 实验前准备:jdk与webgoat的安装 实验点一:SQL 命令注入(Command Injection) 数字型注入(Numeric SQ ...

  2. arcgis python 发送邮件

    import arcgisscripting, smtplib, os, sys, traceback from email.MIMEMultipart import MIMEMultipart fr ...

  3. daoliu平台:测试线路图

    1.进行需求收集及分析 搜索关键字:导流平台 同类产品体验及熟悉 搞清楚,业务流.数据流.用户焦点 2.初步熟悉原型 初步熟悉.遍历原型, 初步进行测试需求分析 3.聆听及和权威的人进行沟通 测试人员 ...

  4. Android简单实现滚动悬停效果

    import android.content.Context; import android.support.design.widget.TabLayout; import android.suppo ...

  5. [Java复习] 分布式高可用-Hystrix

    什么是Hystrix? Hystrix 可以让我们在分布式系统中对服务间的调用进行控制,加入一些调用延迟或者依赖故障的容错机制. Hystrix 的设计原则 对依赖服务调用时出现的调用延迟和调用失败进 ...

  6. 简单模拟 Promise

    class promise { constructor(fn) { this.data = null; this.err = null; this.isPromise = false; this.er ...

  7. tcpdump抓包代码

    tcpdump - tcp[:]=:]=0x4854 or tcp 抓出来的包可以导入wireshark分析 以上代码曾经在ios越狱机器上使用,用于抓包,具体也记不起来了 导入wireshark效果

  8. Linux - Linux命令行常用快捷键

    Common Shortcut Key 用途 快捷键 说明 光标移动 Ctrl + a 把光标移到行首 Ctrl + e 把光标移到行尾 Ctrl + x 在 EOL 和当前位置移动光标 输入编辑 C ...

  9. iOS- Core Foundation对象与OC对象相对转换

    对ARC盲目依赖的同学: 1过度使用block后,无法解决循环引用问题 2遇到底层Core Foundation对象,需要自己手工管理它们的引用计数时,显得一筹莫展 first:对于底层Core Fo ...

  10. 【c# 学习笔记】索引器

    当一个类包含数组成员时,索引器 的使用将大大地简化对类中数组成员的访问.索引器的定义类似于属性,也具有GET访问器和set访问器,如下: [修饰符] 数据类型 this[索引类型 index] { g ...