Electron+React项目搭建
Electron是什么
Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux。
Electron优劣
优点:
- 跨平台兼容性:使用Electron可以轻松地在Windows、Mac和Linux等多个平台上构建桌面应用程序,同时保持一致的用户体验。
- 前端技术栈:Electron基于Web技术栈构建,主要采用HTML、CSS和JavaScript等前端技术,这使得许多前端开发人员可以更快速地入门。
- 社区支持:Electron有一个庞大的社区,拥有大量的开源资源和第三方库,例如React、Vue和Angular等流行的前端框架,以及许多插件和模块,方便开发者使用。
- 高度可定制性:Electron提供了高度的定制性,使得开发人员可以轻松自定义应用程序的功能和界面。
缺点:
- 底层交互差:Electron是基于Chromium和Node.js构建的,因此与原生应用程序相比,其底层交互性可能较差。
- 性能差:与原生应用程序相比,Electron应用程序的性能可能较差。
- 包大:Electron应用程序的体积可能较大,因为它们包含了Chromium和Node.js的运行环境。
创建React项目
npx create-react-app my-app
cd my-app
npm start
浏览器会自动打开网址 http://localhost:3000/
安装Electron
npm install electron -S
npm install electron-is-dev
electron-is-dev 是一个用于判断 Electron 是否处于开发环境的 Node.js 模块。可以在 Electron 的主进程或渲染进程中使用。在开发环境中,它的输出为 true;在非开发环境中,输出为 false。使用 electron-is-dev,可以更好地控制应用程序的行为,例如,在开发环境中启用某些调试工具,或者在非开发环境中启用一些优化设置。
添加入口文件
根目录(不是 src 目录)下面新建 main.js 文件,这个文件和 electron-quick-start 中的官方默认 main.js 几乎一模一样,只修改了加载应用这入口这一个地方:
// electron 模块可以用来控制应用的生命周期和创建原生浏览窗口
const { app, BrowserWindow } = require("electron");
const isDev=require('electron-is-dev');
// 保持window对象的全局引用,避免JavaScript对象被垃圾回收时,窗口被自动关闭.
let mainWindow;
const createWindow = () => {
// 创建浏览窗口
mainWindow = new BrowserWindow({
title: "码上有料",
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true,
enableBlinkFeatures: true,
contextIsolation: false,
},
});
const url=isDev? "http://localhost:3000": "http://localhost:3000";
mainWindow.loadURL(url);
isDev&& mainWindow.webContents.openDevTools();
mainWindow.once("ready-to-show", () => {
mainWindow.show();
});
mainWindow.webContents.on("dom-ready", () => {});
mainWindow.webContents.on("did-finish-load", () => {});
mainWindow.on("closed", () => {
mainWindow = null;
});
};
// 当 app 启动之后,执行窗口创建等操作
app.on("ready", () => {
createWindow();
});
// 所有窗口关闭时退出应用.
app.on("window-all-closed", function () {
// macOS中除非用户按下 `Cmd + Q` 显式退出,否则应用与菜单栏始终处于活动状态.
if (process.platform !== "darwin") {
app.quit();
}
});
app.on("activate", function () {
// macOS中点击Dock图标时没有已打开的其余应用窗口时,则通常在应用中重建一个窗口
if (mainWindow === null) {
createWindow();
}
});
// 你可以在这个脚本中续写或者使用require引入独立的js文件.
添加启动方式
//package.json
{
"main": "main.js",
"homepage": ".",
"author": "ldf6780@163.com",
"description": "码上有料",
"scripts": {
"start:electron":"electron .",
},
}
启动应用:
// 由于我们在main.js文件里使用了url访问到react项目,所以在这里需要先启动react项目
npm start
npm run start:electron
支持热调试,修改代码后,桌面应用也将会重新更新。
应用启动优化
上文所述,启动electron应用需要先启动React应用,再启动electron。
执行多条脚本命令
安装concurrently
npm install concurrently
配置文件:
//package.json
{
"scripts": {
"start": "react-scripts start",
"start:electron": "electron .",
+ "dev":"concurrently \"npm start\" \"npm run start:electron\""
},
}
启动应用:
npm run dev
优点:
- 只需执行一次命令即可启动两个应用 不足:
- 浏览器是启动起来了,Electron里面却是白板
- 只有Cmd+R快捷刷新,才能把Electron里的内容刷出来
只启动electron
当react应用启动成功,在启动electron。
安装wait-on工具:
npm install wait-on -D
可以延迟运行脚本直到端口准备就绪。
配置文件:
//package.json
{
"scripts": {
"start": "react-scripts start",
"start:electron": "electron .",
+ "dev": "concurrently \"npm start\" \"wait-on http://localhost:3000/ && npm run start:electron\""
},
}
使用wait-on在 http://localhost:3000 启动好,才会打开Electron窗口。避免了先启动Electron,等待服务时候的白屏现象。
再次启动
如图,React默认情况下会打开一个浏览器窗口,但对于 Electron 开发来说,这是不必要的。咱们可以通过传递环境变量BROWSER=none来禁用此行为。
使用的脚手架create-react-app,这个脚手架提供了一个环境变量,BROWSER,说到环境变量,我们需要安装一个库 cross-env,跨平台设置环境变量。
安装cross-env工具:
npm install cross-env -D
配置文件:
//package.json
{
"scripts": {
"start": "react-scripts start",
"start:electron": "electron .",
+ "dev": "concurrently \"cross-env BROWSER=none npm start\" \"wait-on http://localhost:3000/ && npm run start:electron\""
},
}
再次启动,只启动了React服务和electron应用。
到此,就可以愉快的开发我们的项目了。
项目打包
React打包
首先修改main.js, 因为现在你要将 react 项目打包在 build 文件夹下面,所以加载应用处改成如下!当然也可在某个配置文件里面配置是否属于开发,此处用if判断一下从未进行选择执行哪段加载应用代码。但是这里为了简便,暂且使用直接修改的方式:
if (!isDev) {
// 加载应用----react 打包
mainWindow.loadURL(
url.format({
pathname: path.join(__dirname, "./build/index.html"),
protocol: "file:",
slashes: true,
})
);
} else {
// 加载应用----适用于 react 开发时项目
mainWindow.loadURL("http://localhost:3000/");
}
默认情况下,homepage 是 http://localhost:3000,build 后,所有资源文件路径都是 /static,而 Electron 调用的入口是 file :协议,/static 就会定位到根目录去,所以找不到静态文件。在 package.json 文件中添加 homepage 字段并设置为"."后,就可以开始打包了。
"homepage":"."
npm run build
electron打包
可用打包工具:
- electron-builder
- electron-packager
安装electron-packager:
npm install electron-packager --save-dev
electron-packager命令:
npx electron-packager <sourcedir> <appname> --platform=<platform> --arch=<arch> [optional flags...]
参数说明:
- sourcedir:项目所在路径
- appname:应用名称
- platform:确定了你要构建哪个平台的应用(Windows、Mac 还是 Linux)
- architecture:决定了使用 x86 还是 x64 还是两个架构都用
- electron version:electron 的版本
- optional options:可选选项
特点:
- 支持平台有:Windows (32/64 bit)、OS X (also known as macOS)、Linux (x86/x86_64);
- 进行应用更新时,使用electron内置的autoUpdate进行更新
- 支持CLI和JS API两种使用方式;
在 package.json 文件的在 scripts 中加上如下代码:
"package": "npx electron-packager ./ code --out ./outApp --arch=arm64 --electron-version=26.2.0 "
打包完成后会在~/目录下生成对应平台的包。 打包的时候会把浏览器内核完整打包进去,所以就算你的项目开发就几百k的资源,但最终的打包文件估计也会比较大。
最后
electron确实是一个跨平台开发应用的利器,通过web开发就能实现wirte once, run every where的理念。
在electron里面可以调用nodejs几乎所有的功能,当然前提是需要require nodejs的包; 在react的js页面或者公司项目用到的Ant Design的一些js页面需要用到electron时候,通过官方的
const electron = require('electron')
语句并不能成功引入,此时需要通过
const electron = window.require('electron')
引入。
转载自:https://juejin.cn/post/7276814487054417957