开发环境 Vite 插件
主进程的代码写好后,需要编译过之后才能被 Electron 加载,通过 Vite 插件的形式来完成编译和加载工作。
import { ViteDevServer } from 'vite';
interface IAddressInfo {
address: string;
port: string;
}
export let devPlugin = () => {
return {
name: 'dev-plugin',
configureServer(server: ViteDevServer) {
require('esbuild').buildSync({
entryPoints: ['./src/main/mainEntry.ts'],
bundle: true,
platform: 'node',
outfile: './dist/mainEntry.js',
external: ['electron'],
});
server?.httpServer?.once('listening', () => {
let { spawn } = require('child_process');
let addressInfo: IAddressInfo = server?.httpServer?.address() as unknown as IAddressInfo;
let httpAddress = `http://${addressInfo?.address}:${addressInfo?.port}`;
let electronProcess = spawn(require('electron').toString(), ['./dist/mainEntry.js', httpAddress], {
cwd: process.cwd(),
stdio: 'inherit',
});
electronProcess.on('close', () => {
server.close();
process.exit();
});
});
},
};
};
注册了一个名为 configureServer 的钩子,当 Vite 启动 Http 服务时,configureServer 会执行。
入参为类型为 ViteDevServer 的对象 server,server 持有一个 http.Server 类型的属性 httpServer,这个属性代表调试 Vue 页面的 http 服务,一般情况下地址为: http://127.0.0.1:5173/。
通过监听 server.httpServer 的 listening 事件来判断 httpServer 是否已经成功启动。如果已经成功启动,就启动 Electron 应用,并给它传递两个命令行参数,第一个参数是主进程代码编译后的文件路径,第二个参数是 Vue 页面的 http 地址。
通过 Node.js child_process 模块的 spawn 方法启动 electron 子进程,除了两个命令行参数外,还传递了一个配置对象。
这个对象的 cwd 属性用于设置当前的工作目录,process.cwd() 返回的值就是当前项目的根目录。
stdio 用于设置 electron 进程的控制台输出,这里设置 inherit 可以让 electron 子进程的控制台输出数据同步到主进程的控制台。
在主进程中 console.log 的内容就可以在 VSCode 的控制台上看到了。
当 electron 子进程退出的时候,要关闭 Vite 的 http 服务,并且控制父进程退出,准备下一次启动。
http 服务启动之前,使用 esbuild 模块完成了主进程 TypeScript 代码的编译工作,这个模块是 Vite 自带的,不需要额外安装,可以直接使用。
主进程的入口文件是通过 entryPoints 配置属性设置的,编译完成后的输出文件是通过 outfile 属性配置的。
编译平台 platform 设置为 node,排除的模块 external 设置为 electron,这两个设置使在主进程代码中可以通过 import 的方式导入 electron 内置的模块,非但如此,Node 的内置模块也可以通过 import 的方式引入。
在 vite.config.ts 文件中引入:
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import { devPlugin } from './plugins/devPlugin';
// https://vitejs.dev/config/
export default defineConfig({
plugins: [devPlugin(), vue()],
})
在 tsconfig.node.json 中配置 plugins 路径:
{
"compilerOptions": {
"composite": true,
"module": "ESNext",
"moduleResolution": "Node",
"allowSyntheticDefaultImports": true
},
"include": ["vite.config.ts", "./plugins/*.*"]
}
执行命令 npm run dev:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论