0%

小白踩坑记: TypeScript+React+Electron 项目搭建

最近想做一个mac的桌面的小工具,经过调研后决定使用Electron进行开发。

Electron是一个能让你使用传统前端技术(Nodejs, Javascript, HTML, CSS)开发一个跨平台桌面应用的框架,它将 Chromium 和 Node.js 的事件循环整合到了一起,同时提供了一些与原生系统交互的 API。

在开发语言上选择了TypeScript

TypeScript是一种通过添加类型定义来扩展JavaScript的语言。

在框架上则选用了熟悉的React

React 是一个声明式,高效且灵活的用于构建用户界面的 JavaScript 库。它让你使用小巧而独立的「component」,来建立复杂的 UI。

Quick Start

首先我们通过create-react-app创建一个新的React项目

1
2
3
npx create-react-app react-ts-electron-starter --template typescript
cd react-ts-electron-starter
yarn run

这时我们可以看到浏览器新标签中打开了 http://localhost:3000/
WX201912261144242x.png
如果看到了上图,恭喜你已经迈出了第一步,接下来我们开始在这个react项目中添加Electron

1
2
yarn add electron-is-dev electron-reload
yarn add -D concurrently electron electron-builder wait-on

然后在public文件夹中添加Electron的启动脚本 electron.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
const electron = require('electron');
const app = electron.app;
const BrowserWindow = electron.BrowserWindow;

const path = require('path');
const url = require('url');
const isDev = require('electron-is-dev');

let mainWindow;

function createWindow() {
mainWindow = new BrowserWindow({width: 900, height: 680});
mainWindow.loadURL(isDev ? 'http://localhost:3000' : `file://${path.join(__dirname, '../build/index.html')}`);
mainWindow.on('closed', () => mainWindow = null);
}

app.on('ready', createWindow);

app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit();
}
});

app.on('activate', () => {
if (mainWindow === null) {
createWindow();
}
});

并通过package.json中的main字段指定该启动脚本

1
"main": "public/electron.js",

最后我们需要把electron的启动命令和打包命令添加到package.json

1
2
"electron-dev": "concurrently \"BROWSER=none yarn start\" \"wait-on http://localhost:3000 && electron .\"",
"electron-pack": "yarn build && electron-builder"

激动人新的时刻来了,启动我们的项目

1
yarn electron-dev

这时可以看到我们的程序出现在桌面上
WX201912261345882x.png
我们再尝试一下打包

1
yarn electron-pack

这时可以看到打包好的程序就在dist目录下。

Environment

1
2
3
4
5
6
7
8
9
10
$ node -v
v12.13.1
$ yarn -v
1.21.1
$ npm -v
6.4.1
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.15.2
BuildVersion: 19C57

项目结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
├── LICENSE
├── README.md
├── build
│   ├── asset-manifest.json
│   ├── electron.js
│   ├── favicon.ico
│   ├── index.html
│   ├── logo192.png
│   ├── logo512.png
│   ├── manifest.json
│   ├── precache-manifest.7cb256453d95f0189a9447ad66531c7d.js
│   ├── robots.txt
│   ├── service-worker.js
│   └── static
├── dist
│   ├── builder-effective-config.yaml
│   ├── latest-mac.yml
│   ├── mac
│   ├── react-ts-electron-starter-0.1.0-mac.zip
│   ├── react-ts-electron-starter-0.1.0.dmg
│   └── react-ts-electron-starter-0.1.0.dmg.blockmap
├── package.json
├── public
│   ├── electron.js
│   ├── favicon.ico
│   ├── index.html
│   ├── logo192.png
│   ├── logo512.png
│   ├── manifest.json
│   └── robots.txt
├── src
│   ├── App.css
│   ├── App.test.tsx
│   ├── App.tsx
│   ├── index.css
│   ├── index.tsx
│   ├── logo.svg
│   ├── react-app-env.d.ts
│   └── serviceWorker.ts
├── tsconfig.json
└── yarn.lock

Github

此项目相关内容已托管于Github,可以clone代码直接使用
https://github.com/Angboo/react-ts-electron-starter

Question

  • 如果我们遇到node-gyp rebuild 执行失败的情况,可以尝试执行下面的命令重装xcode command line tool
1
2
sudo rm -rf /Library/Developer/CommandLineTools
xcode-select --install
-------------本文结束感谢您的阅读-------------