Electron是由Github开发,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一个开源库。 Electron通过将 Chromium 和 Node.js合并到同一个运行时环境中,并将其打包为Mac,Windows和Linux系统下的应用来实现这一目的。
相信大部分前端同学都听说或者了解过NodeJs 它是一个基于Chrome V8 引擎的JavaScript运行时, 而 Chromium 是Google为发展自家浏览器Chrome而开启的开源浏览器项目,可以看成是是Chrome的先行版。大家较为熟悉的VS Code 和 Atom就是使用Electron来完成的。
从开发的角度来看, Electron application 本质上是一个 Node. js 应用程序。可以让前端开发者让你使用纯 JavaScript 调用丰富的原生操作系统APIs来创造桌面应用~
Quick Start
确认你的网络可以访问github , 若访问受限参考 安装指南 来了解如何用代理、镜像和自定义缓存
你肯定已经已经安装好git和node了,那么只要:
1 | # 官网已经有 electron-quick-start 仓库克隆下来 |
然后你的第一个桌面应用就开启了!
若你跟着一起实践到这里,肯定会发现界面有些许不同?我这里多了个调试界面,那么来看下代码看看。在Electron中main.js是入口文件:
1 | //main.js |
与现有React工程结合
迫于不会Vue ,在这里介绍下React工程如何和Electron结合起来。
偷懒就直接使用 create-react-app 来创建react工程:
1 | #若已安装 请忽略 |
添加 Electron 配置并启动
一、 安装 Electron包
1 | # 在 react-electron 目录下安装 Electron 包 |
二、 添加main.js
在 react-electron 目录下添加main.js ,直接使用上面 main.js的内容 ,然后
1 | //win.loadFile('index.html') 这一行替换为: |
这样就将入口界面指定到react的初始界面了。
三、 启动Electron!
修改 package.json ,添加 main homepage字段,并添加electron-start命令:
1 | "main": "main.js", |
启动 Electron:
1 | # 启动react项目 |
看到一篇 文章 CREATE AN APP WITH ELECTRON AND REACT 写create-react-app和Electron结合的不错,大家也可以参考这个。
四、在react中使用electron
直接在react中使用import electron会产生问题 issues/7300,可以写成这种形式:
1 | const electron = window.require('electron'); |
主进程和渲染进程
Electron 与web应用的区别不是很大,在原web应用的基础上添加主线程交互代码后,甚至可以将一个线上web应用迅速的包装成为一个客户端应用! Electron并且内集成了 Nodejs,Nodejs 在主进程和渲染进程中都可以使用,这为我们提供了npm成千上万的模块。
所以个人感觉应用Electron的重要在于理解主进程和渲染进程,和进程间的交互。其他API可以自己花点时间阅读文档。
运行Electron入口文件的进程(也就是上文运行main.js的进程)被称为主进程,它控制着整个 App 的生命周期,从打开到关闭。 它也管理着系统原生元素比如菜单,菜单栏,Dock 栏,托盘等。 主进程负责创建 APP 的每个渲染进程。而且整个 Node API 都集成在里面;
而在主进程创建的一个个web页面(对应上文中的win窗口)也都运行着自己的进程,即渲染进程,渲染进程各自独立,各自拥有自己的生命周期。与主进程不同的是,它能够同时存在多个而且运行在不一样的进程。而且它们也能够被隐藏。在通常的浏览器内,网页通常运行在一个沙盒的环境挡住并且不能够使用原生的资源。 然而 Electron 的用户在 Node.js 的 API 支持下可以在页面中和操作系统进行一些低级别的交互。
进程间通信
Electron提供了几种通信方式:
一 使用ipc-renderer 和 ipc-main :
ipc-renderer 和 ipc-main 异步交互:
1 | //在渲染进程中: |
ipc-renderer 和 ipc-main 同步交互:
1 | //在渲染进程中: |
二 在渲染进程使用remote模块
1 | // 在渲染进程打开提示对话框 |
三 在主进程向渲染进程webContents发送消息
1 | win.webContents.send('ping', 'whoooooooh!') |
四 渲染进程之间的通信
在两个网页(渲染进程)间共享数据最简单的方法是使用浏览器中已经实现的 HTML5 API。 其中比较好的方案是用 Storage API, localStorage,sessionStorage 或者 IndexedDB。
你还可以用 Electron 内的 IPC 机制实现。将数据存在主进程的某个全局变量中,然后在多个渲染进程中使用 remote 模块来访问它。
1 | // 在主进程中 |