快速构建Electron+React+TypeScript

一、安装Node.js环境

二、构建React

安装create-react-app包

npm install -g create-react-app

然后选一块地构建react项目

cd D:/projects/electron+react+typescript
create-react-app my-app --template typescript

项目目录如下

my-app/
├── node_modules/
├── public/
│   ├── favicon.ico
│   ├── index.html
│   └── manifest.json
├── src/
│   ├── App.css
│   ├── App.test.tsx
│   ├── App.tsx
│   ├── index.css
│   ├── index.tsx
│   ├── logo.svg
│   ├── reportWebVitals.ts
│   └── setupTests.ts
├── tsconfig.json
├── package.json
├── package-lock.json
├── README.md

三、安装Electron

在PS终端输入

$env:ELECTRON_MIRROR="https://npmmirror.com/mirrors/electron/"; npm install --save-dev electron

以安装Electron,同时还有electron-builder

npm install --save-dev electron-builder

四、创建文件

在src目录下创建electron.ts


import { app, BrowserWindow } from 'electron';
import path from 'path';
import url from 'url';

let mainWindow : BrowserWindow | null;

function createWindow()
{
    mainWindow = new BrowserWindow
    ({
        width: 800,
        height: 600
    });

    if (process.env.NODE_ENV === 'development')
    {
        mainWindow.loadURL('http://localhost:3000');
    }
    else
    {
        mainWindow.loadFile(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();
    }
});

这里就是窗口的主逻辑。

由于electron本身不支持TypeScript,但是react支持TypeScript,所以需要写一个TS配置将electron.ts编译成electron.js。目录下的那个tsconfig.json是给react用的,需要新建一个配置文件electron-tsconfig.json(名字随便起)

{
    "compilerOptions": {
		"target": "ESNext",
		"module": "CommonJS",
		"outDir": "build",
		"rootDir": "src",
		"strict": true,
		"esModuleInterop": true,
		"skipLibCheck": true,
		"types": ["node", "electron"]
	},
	"include": ["src/electron.ts"]
}
  

这里rootDir指向存放源码(electron.ts)的目录,outDir是指输出目录,types要填写node和electron以供TypeScript识别。这里只编译electron.ts这一个文件(include项)

src/electron.ts ===编译===>build/electron.js

然后我们在package.json中绑定我们的electron入口:

"main": "build/electron.js",

再添加

"homepage": "./",

以确保react页面的加载

五、命令设置

在package.json的scripts中,有react事先部署好的四个命令:

"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",

在下面添加:

"start-electron": "tsc -p electron-tsconfig.json && electron .",
"build-electron": "tsc -p electron-tsconfig.json",
"dist-release": "npm run build && npm run build-electron && electron-builder --dir --win --x64",
"dist-setup": "npm run build && npm run build-electron && electron-builder --win --x64"

start-electron用于启动electron,命令中先使用tsc按照自定义的用于electron的ts编译配置将electron.ts编译成electron.js,然后调用electron以当前目录(.)启动

build-electron用于构建electron,仅编译

dist-release用于构建发布版,命令中首先构建react,然后在调用build-electron构建electron,最后用electron-builder构建整个项目

dist-setup用于构建安装包

六、使用

一个ps终端用于运行react:npm run start

一个ps终端用于运行electron:npm run start-electron

然后electron就会把端口3000的react页面渲染出来

要是打包的话,dist-release导出不需要安装的包,dist-setup导出需要安装的包

这里还需要在根目录创建.npmrc并写入:

ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/
ELECTRON_BUILDER_BINARIES_MIRROR=https://npmmirror.com/mirrors/electron-builder-binaries/

electron-builder会自己下载一些文件,在这里指定下载镜像速度会快一点

electron-builder还需要做一些配置,在package.json下添加
 


  "build": {
    "appId": "com.example.app",
    "productName": "MyApp",
    "extends": null,
    "asar": true,
    "directories": {
      "output": "release"
    },
    "files": [
      "build/**/*",
      "dist-electron/**/*",
      "!node_modules/**/*",
      "!**/*.map"
    ],
    "win": {
      "target": "nsis",
      "artifactName": "${productName}-${version}-win-${arch}-Setup.exe"
    },
    "nsis": {
      "oneClick": false
    }
  }

这里extends: null用于取消默认的配置,否则electron-builder会默认按照publish/electron.js来寻找electron的主入口

这里使用nsis作为可安装程序的框架

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值