vite+vue3+ts+electron桌面应用web端桌面端开发及生产打包配置!
前言
上一章搭建已经搭建好的工程目前只能启动electron桌面端的服务,如果需要启动
web
端服务的话需要将vite.config.ts
中的plugins
中的electron
插件注释掉。这样非常麻烦,所以并不是我想要的效果。这一章我们将会使用不同的脚本命令启动不同服务,并且实现web端、electron端的项目打包。
一、开发环境web端electron端分离的实现方式优缺点
- 要对electron项目进行web跟electron桌面应用分离,目前我所了解到的方法有两种。
1. 传统方式
环境 | web | electron | 优点 | 缺点 |
---|---|---|---|---|
dev | "dev":"vite" | "electron:dev": "electron ." | 清晰明了、简单易理解。 | 打包时比较麻烦 |
build | "build": "vue-tsc --noEmit && vite build" | "electron:build":"vue-tsc --noEmit && vite build && electron-builder" | web端的开发环境、生产环境打包就是一个正常的web项目流程,几乎没有任何学习成本。 electron打包也只需要在web打包命令的基础上添加一个electron-builder命令即可,极其简单。 | ts 项目中,需要将electron文件中的ts入口文件先进行打包编译,并设置package.json 的入口文件为打包编译后的.js文件作为入口文件例:dist/electron/main.js 。 |
2. 使用vue-plugin-electron插件的方式
环境 | web | electron | 优点 | 缺点 |
---|---|---|---|---|
dev | "dev":"vite" | "electron:dev": "vite --config vite.config.electron.ts" | electron 跟web 端的配置分离,可针对不同环境编写独立的脚手架文件 | 需要写两套vite.config 配置文件,然后使用vite --config 指定配置文件来区分,当业务简单时可能会显得有些冗余 |
build | "build": "vue-tsc --noEmit && vite build" | "electron:build": "vue-tsc && vite build --config vite.config.electron.ts && electron-builder" | electron 跟web 端的配置分离,可针对不同环境编写独立的脚手架文件 | 需要写两套vite.config 配置文件,然后使用vite --config 指定配置文件来区分,当业务简单时可能会显得有些冗余 |
- 本章节会使用插件的方式对开发环境跟打包配置详解。
二、web、electron开发环境搭建
我们已经知道当执行
pnpm dev
命令时会默认读取vite.config.ts文件中的配置信息启动开发服务,此时由于使用了vite-plugin-electron
插件。所以就会启动electron的开发环境。 因此我们需要按照以下步骤新增一个electron
服务的config
文件与web服务的config
文件分开管理。
- 使用
vite.chonfig.ts
文件复制一份名为vite.config.electron.ts
的electron专属配置文件。- 删除
vite.chonfig.ts
中的vite-plugin-electron
插件,恢复初始化的样子。- 在
package.json
文件添加命令"electron:dev": "chcp 65001 && vite --config vite.config.electron.ts"
"electron:dev": "chcp 65001 && vite --config vite.config.electron.ts"
chcp 65001:
解决控制台中文乱码问题。vite --config vite.config.electron.ts:
指定vite运行时的配置文件。
- 执行
pnpm dev
跟pnpm electron:dev
尝试一下。。
完美! 注意:传统方式在这就不演示了。感兴趣的同学可以按以下步骤尝试一下。
- 添加命令
"app:dev": "electron ."
。- 同样将
vite.config.ts
中的viet-plugin-electron
插件删除或注释。- 执行
pnpm dev
跟pnpm app:dev
尝试一下。这种方式一定要注意
package.json
文件中入口文件main
属性的值是否正确哦。
三、打包
目前我知道的打包方式共有两种。
- electron官方提到的electron-forge(我没成功!所以用第二种方式,应该也是大多数
vue + electron
项目的常用打包方式) - 使用
electron-builder
构建。
1. web端
web端打包直接执行
pnpm build
进行打包构建,然后将打包结果dist
文件夹部署在web服务器即可。
我这里启动了一个本地
Nginx
并监听80
端口来检查打包结果是否正常运行。Nginx
知识可自行百度查看即可。
将dist
文件夹中的文件放入nginx/html中
在浏览器输入localhost:80
访问页面,也是没有问题。
web打包成功!非常的简单。
2. electron桌面端
- 安装
electron-builder
依赖。
pnpm add -D electron-builder
- 在
package.json
添加脚本。
"name": "web-electron-template",
"private": true,
"version": "0.0.1",
"main": "dist-electron/main.js",
"scripts": {
"dev": "vite",
"build": "vue-tsc --noEmit && vite build",
"preview": "vite preview",
"electron:dev": "chcp 65001 && vite --config vite.config.electron.ts",
"electron:build": "vue-tsc && vite build --config vite.config.electron.ts && electron-builder"
},
......
- 在
electron/main.ts
中配置应用加载路径。
/** electron/main.ts */
import { app, BrowserWindow } from 'electron';
import path from 'node:path';
const createWindow = () => {
const win = new BrowserWindow({
width: 960,
height: 600,
webPreferences: {
nodeIntegration: true, // 设置是否在页面中启用 Node.js 集成模式
contextIsolation: false, // 设置是否启用上下文隔离模式。
},
});
if (process.env.VITE_DEV_SERVER_URL) {
win.loadURL(process.env.VITE_DEV_SERVER_URL); // 使用vite开发服务的url路径访问应用
} else {
win.loadFile(path.join(__dirname, '../dist/index.html')); // 打包后使用文件路径访问应用
}
};
app.whenReady().then(createWindow);
- 在根目录新增一个
electron-builder.json
文件设置electron-builder
打包配置,src
文件夹同级。
/** electron-builder.json */
// 暂时先设置这两个配置防止打包后的应用出现的各种问题。(后面解释为什么需要设置)
{
"files": ["dist/**/*", "dist-electron/**/*"], // 设置需要打包的文件
"directories": {
"output": "release" // 设置出口文件
}
}
- 执行
pnpm electron:build
进行打包。
dist
:由vite
打包后的产物。dist-electron
:由vite-plugin-electron
插件编译打包后生成的产物(为了将ts文件编译为js文件)。release
:由electron-builder
将dist
跟dist-electron
合并打包后生成的产物,其中的文件无需关注,目前我们仅关注.exe
文件即可。(太多了,有些我也不懂😕!)
安装桌面应用
- 在资源管理器中打开文件夹。
- 直接双击
.exe文件
安装 。- 完成。
这样就打包安装成功了!
四、使用asar解压工具排查解决打包后的bug
如果是对
electron
打包后出现bug
不知道如何排查,那么这一小节应该能对大家有所帮助。 在学习解决打包后产生的各类bug
之前,需要先安装一个.asar
压缩文件的解压工具,使用asar
解压工具将electron打包后的app.asar
解压后查看,方便快速排查解决部分打包文件路径不对造成的bug
。
- 全局安装
asar
依赖。
pnpm add -g asar
- 进入
release/win-unpacked/resources
文件夹
- 打开终端执行
asar extract app.asar ./
命令即可查看打包后的文件目录。
1. 使用electron-builder默认配置时导致应用白屏问题
此处我将会删除
electron-builder.json
配置文件,使用默认配置进行打包测试。 我当前的文件目录结构👇。
🚀直接打包安装。
此时
electron-builder
就会将打包结果输出到dist
文件夹下,双击安装应用后打开,这时候就会发现,当前的应用打开后就白屏了。
这时候先不要慌,选中菜单栏的
view
选项,打开devTools
排查白屏的原因。
此时观察network可以发现,
index.html
文件请求失败了。
为什么会失败呢?
- 复制
app.asar/dist/index.html
前面的文件路径找到app.asar
文件的所在目录。- 使用
asar extract app.asar ./
命令解压查看源文件。
这时候就发现
app.asar
中压根就没有dist
文件夹,所以当然就无法找到dist/index.html
所以这就是造成白屏的原因。 解决方法:因为打包后的electron/main.ts
文件是在dist-electron/main.js
中,所以只需要将electron/main.ts
中的'../dist/index.html'
修改为'../index.html'
后再次打包,这样electron
的路径就是app.asar/index.html
了。
此时
electron
应用的首页路径就配置正确了,但是你会发现他依旧还是白屏。又是为什么呢🤔? 如图所示,依旧还是源加载失败了。这次是main.ts
😶。
一开始我也非常好奇,为啥会有
.ts
文件会被加载呢,.ts
文件不都已经配置了需要编译再打包嘛。 后来经过不断的排查➕测试,终于让我明白了其中的原因。
- 首先:检查
main.ts
资源请求的原因。(发现index.html
没有进行编译就打包了)
- 分析未被解析打包的原因。
由于
electron-builder
在没有指定要打包的文件时,默认会将整个项目目录作为输入然后打包输出到dist
文件夹中。
- 此时就会发生两件事: ①
vite
打包的dist
文件夹被覆盖。 ②electron-builder
会将根目录所有文件原封不动的打包解压到app.asar
文件中`。
修改vite
打包输出文件修改为web-dist
后打包分析。
在外部资源管理器打开\dist\win-unpacked\resources
并执行asar extract app.asar ./
提取源文件。
经过这解压后的源文件进行分析,我们可以发现,整个目录所有文件都被electron-builder
默认打包到app.asar
中了,得到了证实。不过虽然现在多了很多无用的文件,但如果将electron/main.ts
文件的'../index.html'
修改为'../web-dist/index.html'
,使用vite
已经打包好的index.html
作为electron
的首页入口文件。那么此时页面也可以正常显示了🤩🤩!
当然这不是我们的最终解决方案,接下来我们直接通过配置
electron-builder
的配置来解决这个问题。electron-builder
的打包配置有两种方式。
- 在package.json中添加
"build"
属性即可配置electron-builder
的打包配置项。- 在根目录添加
electron-builder.json
配置文件添加相关配置
指定electron-builder
需要打包的文件
/** electron-builder.json */
{
"files": ["dist/**/*", "dist-electron/**/*"], // "dist/**/*"表示dist文件夹下的所有目录及文件
"directories":{
"output":"release" // 设置出口文件
}
}
此时
electron-builder
的打包结果就会输出到release文件夹中了,并且不会将没有用的文件打包到输出结果中了。
此时就只有dist
、dist-electron
文件夹被打包出来。(node_modules跟package.json我也不知道为什么还会打包出来,此处不深究了。)
最后:为了能顺利打开应用,还需要将electron/main.ts
中的文件路径修改一下。
win.loadFile(path.join(__dirname, '../dist/index.html'));
// win.loadFile(path.join(__dirname, '../index.html'));
// win.loadFile(path.join(__dirname, '../web-dist/index.html'));
再次双击
.exe
文件自动安装打开就可以啦,非常完美🤩🤩。
桌面跟开始菜单也会创建
web-electron-template
应用的快捷方式。
总结
内容太多太杂乱了,无法总结了!! 😩😩😩😩 help!!😩😩😩😩 下次一定!
参考文献
-
asar文件详解:juejin.cn/post/721317…
-
更多electron-builder的详细知识跟配置可以访问这篇文章学习。非常棒棒。juejin.cn/post/684490…
任务列表
- 搭建electron项目
- 运行electron桌面端开发环境
- 运行web浏览器端开发环境
- 打包
- electron通信
转载自:https://juejin.cn/post/7248982532727963705