一、前言

最近自己有个小的需求,是做一个能编辑本地特定文本的工具,需要跨平台, Windows 和 macOS,这样,如果用原生开发的话,Windows 就要用 c# macOS 就要用 swift,学习成本高,并且学完用处也不是很大。
我本身是前端开发的,发现了这个 electron 能满足我的需求,跨平台运行,内部是 js 驱动的,简直就是如鱼得水。
顺便把学习的经历写出来,分享需要的人,我会按标题序号渐进式地编写内容。
如果你喜欢这个文章,欢迎点赞评论支持。

二、什么是 electron

electron 其实就是个壳子,一个可以展示网页内容的壳子,相当于一个独立的浏览器,而这个浏览器可以提供给你一些接口,去调用系统的资源。

一般在浏览器中网页是没有权限去调用系统资源的,本地文件都无法自主获取,只能通过用户操作喂给浏览器才行。

有了 electron 就自由了,可以调用 electron 提供的一些系统功能,所有 nodejs 中可以使用的功能都可以。

(一)什么是 Electron,由来、适用场景 和 Electron 的环境搭建(1/7) - 图1

你看到的 electron 程序内的界面全是 html + css 搭建的,并不是原生系统的界面。

electron 的一个很大的优势是可以做到一套代码通吃各平台,因为它的核心逻辑是 js 写的,只需要给不同平台的应用套上一个对应的外壳即可。

应用场景

我感觉有两种应用场景很适合用 electron,都是趋于本地化的:

  • 一种是希望给现有项目打包成可执行文件,直接双击打开使用,不需要布署 web 服务器
  • 另一种是想做一个本地化的工具,能操作系统资源,并且能跨平台使用

实例

其实你正在用的应用中就有不少是用 Electron 做的, VSCode 就是,你敢信?还有比较不错的下载工具 Motrix

好像新版 macOS 的 QQ 也是用类似 electron 的东西做的

由来

electron 的前身是 atom 编辑器,是在它的基础上实现过来的一套跨平台解决方案,

参阅:Introducing Electron

electron具体能实现些什么功能,具体可以看这里

三、环境搭建

1. 所需的基础文件

基础的环境搭建只需要三个文件

github: https://github.com/KyleBing/electron-demo

  1. .
  2. ├── app.js
  3. ├── index.html
  4. └── package.json

所有使用 npm 的项目都是一个 npm 包,只不过你的包是私密的。这个可以去看 npm 基础。

package.json

package.json 中只需要在 devDependencies 标签中添加 electron 即可

字段 main 指定程序的入口 js 文件,也就是上面的 app.js

这个名字自己随便定, main.js 也行,对应上就可以。

electron 的版本号不一定非是这个,用最新的就好了。这个是我写教程时的最新版本。

  1. {
  2. "name": "electron-demo",
  3. "version": "0.1.0",
  4. "private": true,
  5. "author": {
  6. "name": "KyleBing",
  7. "email": "kylebing@163.com"
  8. },
  9. "description": "demo-electron",
  10. "main": "app.js",
  11. "scripts": {
  12. "start": "electron ."
  13. },
  14. "devDependencies": {
  15. "electron": "^13.1.7"
  16. }
  17. }
app.js

这是程序的入口文件,electron 的主进程就是这个。里面是关于 electron app 的一些生命周期方法

  1. const {app, BrowserWindow} = require('electron');
  2. const url = require("url");
  3. const path = require("path");
  4. let mainWindow
  5. function createWindow() {
  6. mainWindow = new BrowserWindow({
  7. width: 800,
  8. height: 600,
  9. webPreferences: {
  10. nodeIntegration: true,
  11. contextIsolation: false
  12. }
  13. })
  14. mainWindow.loadURL(
  15. url.format({
  16. pathname: path.join(__dirname, 'index.html'), // 指定好对应的主页文件就好了
  17. protocol: "file:",
  18. slashes: true
  19. })
  20. )
  21. mainWindow.on('closed', function () {
  22. mainWindow = null
  23. })
  24. mainWindow.webContents.openDevTools() // 显示这个窗口的调试窗口,如果不想显示,删除该段即可
  25. }
  26. // 程序启动时
  27. app.on('ready', ()=>{
  28. createWindow()
  29. })
  30. // 所有窗口关闭时
  31. app.on('window-all-closed', function () {
  32. if (process.platform !== 'darwin') app.quit()
  33. })
  34. // 程序处于激活状态时
  35. app.on('activate', function () {
  36. if (mainWindow === null) {
  37. createWindow()
  38. }
  39. })
index.html

目前只是简单的 html 主页文件

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Eelctron-Demo</title>
  6. </head>
  7. <body>
  8. <h1>Electron Demo</h1>
  9. <p>你好呀!</p>
  10. </body>
  11. </html>

2. 安装依赖

安装依赖会比较麻烦,electron 安装的时候需要从外网下载对应系统的依赖文件,而这个下载是不会经过 npm 的,也就是说使用国内的 npm 源地址是无法正常安装的。

如果你已经使用了国内的 npm 源地址,请将它调整回官方的 npm 源地址,不然将无法正常安装 electron。

nrm 的使用

正常国内网络基本上无法安装 electron, 速度10kb/s 左右吧,最终都会因超时而失败。只能用代理装。

写程序这块,如果没有代理简直跟瞎了一样,建议找个渠道整一个。

http://kylebing.cn/diary/#/share/6592

你安装的时候也可能会遇到一些问题,比如:

在当前目录下,终端执行 npm 包的安装即可,可以使用 npm

  1. npm i

(一)什么是 Electron,由来、适用场景 和 Electron 的环境搭建(1/7) - 图2

也可以使用 yarn

  1. yarn

(一)什么是 Electron,由来、适用场景 和 Electron 的环境搭建(1/7) - 图3

我喜欢使用 yarn

3. 运行

现在就可以运行了

  1. npm run start

(一)什么是 Electron,由来、适用场景 和 Electron 的环境搭建(1/7) - 图4

就是这么简单。

接下来要做的就是丰富这个页面内容,必要时跟系统、文件系统、网络进行交互,实现更高级的功能。

再具体点的可以看官方文档:
http://www.electronjs.org/docs/tutorial/quick-start

关于打包等一些高级操作,请看专栏后续文章

四、它可以做成什么样子

就像前面提到的, VScode 就是用它做的,还有 Motrix

我自己写了一个工具,大体样子是这样:

五笔助手 https://github.com/KyleBing/wubi-dict-editor

(一)什么是 Electron,由来、适用场景 和 Electron 的环境搭建(1/7) - 图5

当然,这肯定不是一天就写成的,从无到有还是要有个过程的:

WubiDictEditor 的进化过程