返回介绍

开发环境 Vite 插件

发布于 2024-09-11 01:11:54 字数 2952 浏览 0 评论 0 收藏 0

主进程的代码写好后,需要编译过之后才能被 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文