添加 Electron 和 electron-builder 到现有 Vite 项目

1. 安装

Electron 安装时,会访问 Github 下载对应的 Electron 包,但是由于一些众所周知的原因,国内访问 Github 会比较困难,故需要配置代理访问使用国内镜像源

1.1 配置代理

  • 当前方法为配置代理并直接访问 Github ,故和1.2 使用国内镜像源二选一即可
shell 复制代码
$env:ELECTRON_GET_USE_PROXY=1
$env:GLOBAL_AGENT_HTTP_PROXY=http://username:password@server:port
$env:GLOBAL_AGENT_HTTPS_PROXY=http://username:password@server:port

http://username:password@server:port应当被替换为你的代理地址,如: http://127.0.0.1:8081

Electron 代理设置:electron-proxy-doc

注:$env:Windows Powershell中设置环境变量的方法,该环境变量仅适用于当前terminal,建议将相关配置置入.npmrc中,在项目根目录下建立.npmrc文件并填入以下内容即可

ini 复制代码
ELECTRON_GET_USE_PROXY=1
GLOBAL_AGENT_HTTP_PROXY=http://username:password@server:port
GLOBAL_AGENT_HTTPS_PROXY=http://username:password@server:port

填入.npmrc后可以使用npm config ls命令检查配置信息

1.2 使用国内镜像源

  • 当前方法为配置国内镜像源以替代访问 Github,故和1.1 配置代理二选一即可
shell 复制代码
$env:ELECTRON_MIRROR="https://npmmirror.com/mirrors/electron/"
$env:ELECTRON_CUSTOM_DIR="{{ version }}"

Electron 国内镜像设置:electron-custom-mirror

1.3 安装 Electron 和 electron-builder

shell 复制代码
npm install --verbose electron electron-builder --save-dev

1.4 安装 vite-plugin-electron 和 vite-plugin-electron-renderer

shell 复制代码
npm install vite-plugin-electron vite-plugin-electron-renderer --save-dev

2. 创建 electron/index.js

在项目根目录建立electron文件夹,在文件夹内创建index.js并填入以下内容

javascript 复制代码
import { app, BrowserWindow } from 'electron';

function createWindow() {
    const browser = new BrowserWindow({
        width: 800,
        height: 650,
        webPreferences: {
            nodeIntegration: false,
            contextIsolation: true,
        }
    })
    // 在调用`vite`命令启动Vite时, 可以使用环境变量`process.env.VITE_DEV_SERVER_URL`
    if (process.env.VITE_DEV_SERVER_URL) {
        console.log('vite dev server url:', process.env.VITE_DEV_SERVER_URL)
        browser.loadURL(process.env.VITE_DEV_SERVER_URL)
        browser.webContents.openDevTools({mode:'right'})
    } else {
        // 加载文件,`dist/index.html`是Vite构建的默认输出目录
        browser.loadFile('dist/index.html');
    }
}

app.whenReady().then(() => {
    createWindow();

    app.on('activate', () => {
        // 应用启动后无窗口则重新创建窗口
        if (BrowserWindow.getAllWindows().length === 0) createWindow()
    });

    app.on('window-all-closed', () => {
        // 关闭窗口后终止应用
        if (process.platform !== 'darwin') app.quit()
    });
});

这将会在编译后的 Electron 应用启动时, 区分dev环境并创建对应窗口

详见:Electron官方文档-将网页装载到BrowserWindow

注:Electron 版本低于28的情况下不支持ESM规范,请使用require导入

javascript 复制代码
const { app, BrowserWindow } = require('electron/main')

3. 配置 vite.config.js

因为使用了vite-plugin-electron来集成 Electron 和 Vite, 故需要添加以下字段到vite.config.jsplugins部分

javascript 复制代码
import electron from 'vite-plugin-electron/simple'

export default defineConfig({
  plugins: [
    electron({
      main: {
        // Shortcut of `build.lib.entry`
        entry: 'electron/index.js',
      },
      // preload: {
      //   // Shortcut of `build.rollupOptions.input`
      //   input: 'electron/preload.ts',
      // },
      // Optional: Use Node.js API in the Renderer process
      renderer: {},
    }),
})

preload 字段为加载应用预加载脚本,详见:Electron官方文档-使用预加载脚本

4. 配置 package.json

4.1 配置 Electron

除了 package.json 文件包含的必要字段之外,为使用 Electron,package.json 文件还必须包含main字段,以定义 Electron 应用的入口

json 复制代码
{
    "main": "dist-electron/index.js",
}
  • main:Electron应用的入口文件位置

    此处指向了dist-electron/index.js,这是因为使用了vite-plugin-electron来集成 Electron 和 Vite,在执行vite build命令后,electron/index.js默认会被编译到dist-electron/index.js

4.2 配置 electron-builder

4.2.1 name & description & version

electron-builder 需要额外的namedescriptionversion字段来为应用提供描述信息

json 复制代码
{
    "name": "your-app-name",
    "description": "Your App description",
    "version": "0.0.0.0"
}
  • name:应用的名称,应当使用没有空格的唯一名称,以避免与其他应用程序冲突
  • description:应用的描述,用以简短的说明该应用的功能
  • version:应用的版本
4.2.2 build

build字段是 electron-builder 配置的核心,该字段被用来自定义构建过程和结果,例如:包名、图标、输出平台设置等,这是一个基本的build字段示例:

json 复制代码
{
    "build": {
        "productName": "YourApp",
        "appId": "com.yourwebsite.yourapp",
        "directories": {
            "output": "build"
        },
        "win": {
            "icon": "public/icon.png",
            "target": ["portable"],
            "artifactName": "${productName}_${version}.${ext}"
        },
        "compression": "maximum",
        "files": [
            "dist/**/*"
        ]
    },
}
  • productName:指定了构建的应用的名称,该名称将用于安装过程中和生成的安装文件

  • appId:应用的唯一标识符

  • directories

    • output:electron-builder 输出构建文件的目录
    • win:Windows 平台的构建选项
      • icon:应用的图标
      • target:构建目标,此处使用portable来构建一个免安装的单文件应用
      • artifactName:构建结果的命名方式,使用模板字符串配置,详参:文件名模板字符串选项
  • compression:构建过程中使用的压缩级别,此处采用最高压缩以减小编译后应用大小

  • files:文件包含/排除设置,此处设置以包含dist目录下所有文件

此处仅提供了基本的配置示例,其余参数详参:electron-builder 通用配置

4.3 启动和编译脚本

json 复制代码
{
    "script": {
        "electron:start": "electron --trace-warnings .",
    	"electron:build": "vite build && electron-builder",
    	"electron:postinstall": "electron-builder install-app-deps"
    }
}
  • electron:start:默认的 Electron 启动脚本(可省略),因已经配置了vite.config.js,故调用vite命令时将自动启动Electron
  • electron:build:顺序调用vite buildelectron-builder来一键完成 Vite 构建和 electron-builder 构建
  • electron:postinstall:安装 electron-builder 依赖项
相关推荐
游荡de蝌蚪12 分钟前
快速打造Vue后台管理系统
前端·javascript·vue.js
June_liu2 小时前
列太多vxe-table自动启用横向虚拟滚动引起的bug
前端·javascript
云枫晖2 小时前
手写Promise-then的基础实现
前端·javascript
养生达人_zzzz2 小时前
飞书三方登录功能实现与行业思考
前端·javascript·架构
GarrettGao2 小时前
Frida常见用法
javascript·python·逆向
肥晨2 小时前
前端私有化变量还只会加前缀嘛?保姆级教程教你4种私有化变量方法
前端·javascript
小高0072 小时前
前端 Class 不是花架子!3 个大厂常用场景,告诉你它有多实用
前端·javascript·面试
没有鸡汤吃不下饭4 小时前
前端【数据类型】 No.1 Javascript的数据类型与区别
前端·javascript·面试
码流之上4 小时前
【一看就会一写就废 指间算法】设计电子表格 —— 哈希表、字符串处理
javascript·算法
Asort6 小时前
JavaScript 从零开始(七):函数编程入门——从定义到可重用代码的完整指南
前端·javascript