这个项目结构是我在编写 基于Electron 和 Angular 的七牛文件上传App 总结出来的
本文主要介绍如何从零开始搭建高效的Electron开发环境, 主要内容如下:
- 通过合理的目录划分来组织代码
- 使用
npm script
简化开发- 如何在渲染进程开发时使用热更新
- 如何在主进程开发时使用自动重启
- 如何在主进程开发时使用
Typescript
- 如何打包和发布软件
目录结构划分
初始化目录
首先按照常规的方法新建一个项目文件夹(这里我的示例文件夹叫做electron-base
, 然后使用npm init
初始化目录。
目前我们的开发目录如下:
1 | electorn-base |
目录划分
Electron 的开发主要分为两个部分, 其中主进程(Main Process)主要负责打开页面和调用系统底层的资源等, 渲染进程(Renderer Process)则是一个普通的网页窗口.
两个进程的开发有着不同的开发方式, 主进程更像是传统Node
的开发, 而渲染进程则是普通的前端开发. 同时它们之间又有着可以共用的部分(如辅助函数、数据模型等), 因此可以按照下面的方式划分
1 | electorn-base |
Electron quick start
接下来运行npm install electron -D
安装Electron,同时在package.json
添加main
字段, 这代表整个项目的入口文件,这里我们先设置为src/main/main.js
.
顺便添加上两个文件
1 | # src/main.js |
1 | <!-- src/renderer/index.html --> |
在根目录运行electron .
(或者是./node_modules/.bin/electron .
)启动程序
为了以后方便启动程序, 将这段命令添加到package.json
中
1 | // package.json 部分内容 |
开发渲染线程
渲染线程的开发跟普通的前端开发没有多大的区别, 为了开发的效率, 我们通常会选择一款前端开发框架, 这里我选择的是Angular
, 当然也可以选择其他的框架, 只需要按照下文中的要求修改打包路径.
导入Angular(可选, 使用其他框架可以跳过)
这里我使用Angular-cli
工具来初始化项目
安装cli工具
npm install -g @angular/cli
初始化目录
ng new electron-base -sd src/renderer -si -sg -st --routing true --styles scss
修改
.angular-cli.json
1
2
3
4
5
6"apps": [{
"root": "src/renderer", // 源文件目录
"outDir": "out/renderer", // 输出目录
"baseHref": "./", // 解决打包后无法加载文件
...
}]
如何在开发过程中进行代码热更新
前端开发中, 我们可以使用webpack
享受到自动刷新、热更新等方便的功能, 那么在Electron的开发过程我们如何享受的到这些功能了?这里我们只需要简单的修改下main.js
文件即可
1 | function isDev() { |
开发时我们还是按照以前的方式启动一个webpcak
服务器进行开发, Electron通过HTTP
协议打开页面, 这样我们依旧可以享受到代码热更新等功能.
通过设置环境变量NODE_ENV
来区分开发和生成环境, 在package.json
中添加两个命令来方便开发
1 | "scripts": { |
打包渲染线程代码
开发完成后我们需要将前端的代码进行代码打包, 一个好的习惯是将代码的打包目录放置在项目的根目录中, 这里我将前端的打包目录设置在out/renderer
中
Angular项目只需要修改.angular-cli.json
中的outDir
字段, 其他的框架可以自行修改.
在package.json
中添加打包命令
1 | "scripts": { |
开发主线程
主线程的开发如Node
程序的开发没有多大的区别, 这里就不多赘述.
虽然Node
对ES6
的支持已经很完善了, 但更新的标准的支持就不怎么好, 这里我们可以使用Babel
之类的工具进行来使用最新的语法.
这里我推荐使用Typescript
, 优点主要有三个:
- 静态检查, 毕竟是主线程的代码, 有点错误可就是程序直接崩溃的节奏
- 自动提示, 这个不解释
- 编译方便, 比起
Babel
的配置文件,Typescript
的配置要简单的多
使用Typescript (不使用的可以跳过)
安装
Typescript
运行
npm install typescript -D
添加配置文件, 在
src
目录下添加tsconfig.main.json
文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20{
"compilerOptions": {
"outDir": "../out", // 输出目录, 同渲染线程放在一起
"sourceMap": true, // 调试时需要
"moduleResolution": "node",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"target": "es6", // 输出代码版本, 由于在Node中运行, es6没问题
"module": "commonjs", // module 处理方式
"typeRoots": [ // .d.ts 目录
"../node_modules/@types"
],
"lib": [ // 可选, 添加新的语法支持
"es2017"
]
},
"exclude": [ // 排除渲染线程目录
"renderer"
]
}在
package.json
中添加开发和打包命令1
2
3
4
5"scripts": {
...
"dev:main": "tsc -p ./src/tsconfig.main.json -w", // 开发
"build:main": "tsc -p ./src/tsconfig.main.json" // 打包
}
主线程调试 (使用的编辑器是vscode)
添加启动配置文件, 项目根目录新建
.vscode
文件夹,在其中新建launch.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21{
// Use IntelliSense to learn about possible Node.js debug attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [{
"type": "node",
"request": "launch",
"name": "Launch Program",
"cwd": "${workspaceRoot}",
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron",
"program": "${workspaceRoot}/src/main/main.ts", // 你的主文件
"sourceMaps": true,
"outFiles": [
"${workspaceRoot}/out/**/*.js" // 你的输出文件目录
],
"env": {
"NODE_ENV": "development"
}
}]
}使用组合键
ctrl + f5
启动程序在文件中添加断点进行调试
主线程开启自动刷新 (可选)
我们的渲染线程可以做到代码变更后自动刷新页面, 在主线程的开发中我们可以使用 nodemon 来实现同样的功能
安装
nodemon
npm install nodemon -D
修改启动命令
1
2
3"scripts": {
"start": "nodemon --watch src/main --watch src/shared --exec './node_modules/.bin/electron' ./out/main/main.js"
}
以后开发时只需要运行npm start
就可做到主线程的自动刷新
打包主线程
主线程的开发过程我们可能会使用其他的构建工具, 这里我们同渲染线程一样, 将主线程的打包文件放在out
目录中, 至此打包目录的结构应当如下
1 | out |
打包和发布
electron-builder 可以将我们的程序打包成可执行文件, 它的配置信息发在package.json
中
这里配置的是Mac
的打包信息, 具体的可以自行查阅文档
1 | { |
运行npm build
即可打包软件
开发流程
- 运行
npm run dev:renderer
启动渲染线程开发 - 运行
npm run dev:main
启动主线程开发 - 运行
npm start
打开Electron
程序 - 运行
npm build
打包程序