使用 Electron 定制化开发个人笔记客户端软件

Electron 介绍

作为一名热衷于新技术的前端开发工程师,如果你一直期望着打造一款桌面应用,又不希望付出太多的精力花费在 C++、.NET 等技术上,那么使用 Electron 这种低成本的技术来开发跨平台的桌面应用对我们来说性价比是非常高的,从而快速地点亮桌面应用开发的技能点。

Electron 是一个基于 V8 引擎和 Node.js 的开发框架,允许用 JavaScript 开发跨平台(Windows、Mac OS X 和 Linux)桌面应用。用 Electron 开发的应用有很多,如 Visual Studio Code、Atom、支付宝小程序 IDE(蚂蚁开发者工具)等。

整体架构概览

在这里插入图片描述

Electron 主要包含两类进程,主进程(Main Process)和渲染进程(Renderer Process)。当我们在启动一个 App 时,那么会先启动主进程,主进程会启动应用并创建 native UI,随后会在 native UI 上启动一个或多个的 browser window 即 web pages,每一个 BrowserWindow 都是一个渲染进程 。在 native UI 上的不同的 browser windows 它们是独立的沙箱环境,不同的进程之间是互相隔离的,Electron 提供了几种进程之间通信的方式,比如 IPC(inter-process communication)和 RPC(remote-process communication)。

主进程(Main Process)和渲染进程(Renderer Process)

Main Process

Electron 运行 package.json 的 main 脚本(程序的入口)的进程被称为主进程,一个应用只有一个主进程,主进程可以:

  • 主进程包含了 Chromium 和 Node 的运行时环境;
  • 主进程可以通过实例化 BrowserWindow 展示 Web 页面,每一个 Web 页面都会运行在它自己的 渲染进程 中;
  • 主进程可以访问原生的 API(注册快捷键、创建菜单栏等),如果渲染进程需要访问原生 API,那么需要和主进程进行通信,请求主进程来进行相关的调用,再返回给渲染进程;
  • 主进程可以管理所有的 Web 页面和其对应的渲染进程。

Renderer Process

渲染进程主要是用来渲染 Web 页面,并且兼容传统的 Web 页面,支持所有的 DOM API、Node API。除此之外,渲染进程还可以通过和主进程通信来访问原生的 API。

在这里插入图片描述

常用模块的介绍

Electron 提供的模块也是按照主进程和渲染进程来进行划分,不能的模块只能在其对应的进程使用,下面介绍几种常用到的模块。

app 模块

app 模块在主进程中使用。用来控制整个应用程序的事件生命周期,常见的几种监听事件有 ready、before-quit、will-quit。

const {app} = require('electron')

app.on('ready', ()=>{
  console.log('当 Electron 完成初始化时被触发')
})

app.on('before-quit', (e)=>{
  // 可以调用 e.preventDefault() 来阻止默认的行为(即关闭应用程序)
  console.log('在应用程序开始关闭窗口之前触发')
})

app.on('will-quit', (e)=>{
  // 可以调用 e.preventDefault() 来阻止默认的行为(即关闭应用程序)
  console.log('在所有的 Web 窗口关闭,应用程序即将退出时触发')
})

BrowserWindow 模块

BrowserWindow 模块在主进程中使用。用来创建管理浏览器窗口,并且可以控制窗口的大小、边框、标题栏样式等。

const {app} = require('electron')
const isDev = require('electron-is-dev')
const path = require('path')
let  win 
const createWindow = () => {
  win = new BrowserWindow({
    show: false, // 先不显示 Web 页面,等加载后在显示
    webPreferences: {
      nodeIntegration: true // Web 集成 node 环境
    },
    titleBarStyle: 'hiddenInset' //设置标题栏样式,隐藏标题栏, 显示小的控制按钮在窗口边缘
  })
  win.maximize() //打开后自动最大化窗口

  win.loadURL(isDev
    ? 'http://localhost:3000/'
    : `file://${path.join(__dirname, './index.html')}`)
  if (isDev) {
    win.webContents.openDevTools();
  }
  win.once('ready-to-show', () => {
    win.show()
  })
}
app.on('ready', createWindow) // 监听 app 启动后,创建 BrowserWindow 打开 Web 页面

关于 BrowserWindow 的更多配置项参考:

https://www.electronjs.org/docs/api/browser-window#new-browserwindowoptions

ipcMain、webContents 模块

ipcMain 模块在主进程中使用。用来处理从渲染进程(Web 页面)发送出来的异步和同步信息,处理完后,也可以同步或异步将数据返回给渲染进程。

const {ipcMain} = require('electron')
// 监听由渲染进程发送过来的事件,事件名称是'renderer-process-message-listener',发送的数据是 data
ipcMain.on('renderer-process-message-listener', (event, data) => { 
  const backData = 'data'
  event.returnValue = backData // 回复同步信息给渲染进程
  event.reply(backData) // 回复异步信息返回给发送过来的这个渲染进程
  event.sender.send(backData) // 回复异步信息给主窗口这个渲染进程
})

webContents 模块也是用于主进程中。ipcMain 主要是用来处理由渲染进程发送过来的事件,而 webContents 则是用来由主进程主动往渲染进程中发送事件:

win = new BrowserWindow()
win.webContents.send('event-name', {data:'data'}) // 在主进程中使用,调用 browserWindow 的 send 方法进行发送事件

ipcRenderer 模块

在渲染进程中,主要用到的就是 ipcRenderer 模块,用于在渲染进程(Web 页面)中发送同步或异步消息到主线程,也可以接收由主进程回复的消息:

const { ipcRenderer } = require('electron')
// 在渲染进程中主动往主进程中发送消息  ipcRenderer.sendSync 同步发送,ipcRenderer.send 异步发送
const backData = ipcRenderer.sendSync('synchronous-msg', {data:'data'}) 
ipcRenderer.send('asynchronous-msg', {data:'data'})

ipcRenderer.on('main-process-msg-listener', (event, data) => {

})

脚手架的搭建

下载脚手架

1. 下载:

git clone https://github.com/Aceysx/electron-startup.git

2. 安装项目依赖:(在项目根目录下)

npm install

3. 启动:(在项目根目录下)

 electron app/main  //启动 app
 npm start // 启动 web

Web 页面启动成功后,刷新 App 窗口(Ctrl/cmd+r)加载 Web 页面,即可以看到下面的页面:

在这里插入图片描述

脚手架的介绍

本 Chat 主要是为了介绍 Electron,所以为了更加方便轻松地创建用户交互界面、设计简洁的数据状态,脚手架集成了 React、Redux 和 Ant Design UI 帮助快速开发。

如果读者对 React 不熟悉,也可以使用相应的库替换,或者直接使用 HTML/CSS/JavaScript。后续讲解中涉及的 React、Redux 的相关内容时也会做相应的的说明。

启动、调试

在启动成功后,可以看到带有调试控制台的 App 页面,是不是很熟悉,和我们平时开发调试 Web 页面一样:

在这里插入图片描述

来看看脚手架都做了什么。

目录结构

electron-startup
-- app
---- main.js  
-- public
---- index.html
-- src
---- ui
---- index.js
-- package.json

©著作权归作者所有,转载或内容合作请联系作者
支付 ¥7.99 继续阅读
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容