vite + electron-builder 打包配置详解

 更新时间:2022年09月20日 11:56:07   作者:无奈的胖头鱼  
这篇文章主要为大家介绍了electron基于vite + electron-builder 打包配置详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

创一个vite项目

    npm init vite

安装打包工具

    npm i -D electron               // 20.1.0
    npm i -D electron-builder       // 23.3.3

electron是开发时运行环境,electron-builder是打包exe用的。

配置桌面环境

打开 electron 官网,找到“快速开始”。基本上看完这一章就可以实现将页面通过桌面程序运行出来了。

创建 主进程 main.js

项目更目录下创建 main.js文件与 preload.js 文件, 代码可以直接复制官网示例

// main.js
// Modules to control application life and create native browser window
const { app, BrowserWindow } = require('electron')
const path = require('path')
const createWindow = () => {
  // Create the browser window.
  const mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js')
    }
  })
  // 加载 index.html
  mainWindow.loadFile('index.html')
  // 打开开发工具
  // mainWindow.webContents.openDevTools()
}
// 这段程序将会在 Electron 结束初始化
// 和创建浏览器窗口的时候调用
// 部分 API 在 ready 事件触发后才能使用。
app.whenReady().then(() => {
  createWindow()
  app.on('activate', () => {
    // On macOS it's common to re-create a window in the app when the
    // dock icon is clicked and there are no other windows open.
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })
})
// 除了 macOS 外,当所有窗口都被关闭的时候退出程序。 There, it's common
// for applications and their menu bar to stay active until the user quits
// explicitly with Cmd + Q.
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') app.quit()
})
// In this file you can include the rest of your app's specific main process
// code. 也可以拆分成几个文件,然后用 require 导入。
// preload.js
// All the Node.js APIs are available in the preload process.
// 它拥有与Chrome扩展一样的沙盒。
window.addEventListener('DOMContentLoaded', () => {
  const replaceText = (selector, text) => {
    const element = document.getElementById(selector)
    if (element) element.innerText = text
  }
  for (const dependency of ['chrome', 'node', 'electron']) {
    replaceText(`${dependency}-version`, process.versions[dependency])
  }
})

添加electron 运行命令

打开 package.json 在 scrpit 对象中添加 electron 运行命令

    "scripts": {
    "dev": "vite --host",
    "build": "vite build",
    "preview": "vite preview",
    "start": "electron .",
  },

打包项目,生成dist

运行 npm run build, 生成dist文件。并且将main.js中mainWindow.loadFile路径修改为 './dist/index.html'

    const createWindow = () => {
  // Create the browser window.
  const mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, '/preload.js')
    }
  })
  // 加载 index.html
  // mainWindow.loadFile('index.html')
  mainWindow.loadFile('./dist/index.html')
  // 打开开发工具
  // mainWindow.webContents.openDevTools()
}

最后运行 npm run start

解决资源无法加载

最后运行出来会发现是白屏,打开程序控制台可以看到是js文件找不到。 打开dist中index.html发现是js和css路径都是绝对路径,所以这里需要修改为相对路径。

打开 vite.config.js 配置更路径为相对路径

export default defineConfig({
  plugins: [vue()],
  base: './',
})

然后重新打包,再运行npm run start 就可以看到页面了。

开发环境:热更新

这里在开发环境中有一个问题就是,咱们这里的渲染进程是打包好的dist文件,无法每次修改后热更新。只有重新打包生成新的dist后页面才会更新。这在开发的时候显然是方便的。

两个工具 concurrently wait-on

    npm i concurrently -D
    npm i wait-on -D
  • concurrently:方便 script 同时启动多个命令
  • wait-on:它可以等待文件、端口、套接字和 http(s) 资源可用后触发。

开发时热更新,我们就要放弃build一个dist文件来作为渲染进程的做法了。 简单来说,我们正常执行 npm run dev 生成一个页面服务,这样的环境是有热更新的。所以我们只需要在主进程中加载dev服务中的页面作为渲染进程就可以了。 修改一下主进程 main.js

    ...
    const createWindow = () => {
      // Create the browser window.
      const mainWindow = new BrowserWindow({
        width: 800,
        height: 600,
        webPreferences: {
          preload: path.join(__dirname, "/preload.js"),
        },
      });
      // 加载 index.html
      mainWindow.loadURL("http://localhost:3333/");
      // 打开开发工具
      // mainWindow.webContents.openDevTools()
    };
    ...

然后打开两个终端,第一个先执行 npm run dev,等待服务启动后在另外一个里执行npm run start 即可。

当然我们也可以一个命令完成这些。在package.json中添加命令:

    ...
    "scripts": {
        "dev": "vite --host",
        "build": "vite build",
        "preview": "vite preview",
        "start": "electron .",
        "electron": "wait-on tcp:3333 && electron .",
        "exe-dev": "concurrently -k \"npm run dev\" \"npm run electron\""
      },
    ...

开发时执行 exe-dev 即可。

打包exe

添加打包命令

    ...
    "scripts": {
        "dev": "vite --host",
        "build": "vite build",
        "preview": "vite preview",
        "start": "electron .",
        "electron": "wait-on tcp:3333 && electron .",
        "exe-dev": "concurrently -k \"npm run dev\" \"npm run electron\"",
        "exe-build": "electron-builder"
      },
    ...

执行 npm run exe-build ,等待执行结束,dist文件夹下会多一个win-unpacked,其里面有一个exe文件就是我们的程序执行文件。

现在我们加载的还是dev服务,所以还需要修改一下主进程main.js

    ...
      // 加载 index.html
      // 判断当前是否为开发环境
      console.log("isPackaged: ", app.isPackaged);
      if (!app.isPackaged) {
        mainWindow.loadURL("http://localhost:3333/");
      } else {
        mainWindow.loadFile("./dist/index.html");
      }
    ...

app.isPackaged 主要用来判断是否为开发环境。

解决index.html找不到的问题

我们打开win-unpacked,执行exe文件,会发现页面没有内容,打开F12控制台,发现index.html根本没有找到。

其地址 ...dist/win-unpacked/resources/app.asar/dist/index.html,找不到的原因可以大概猜一下是我们的页面没有打包进app.asar中。

所以我们可以在electron-builder打包配置中设置一下我们要打包的文件。

项目更目录创建 electron.config.json

{
  "files": ["main.js", "preload.js", "./dist"],
  "productName": "test"
}

这里我们设置了files字段,其目的就是设置打包的数据内容。 productName 就是设置exe文件的文件名。

然后修改exe-build命令

    "exe-build": "electron-builder -config electron.config.json"

运行命令后,可以看到exe文件已经修改为test.exe。双击运行也可以看到页面了。

最后完善一下打包命令

    "exe-build": "vite build & electron-builder -config electron.config.json"

以上就是vite + electron-builder 打包配置详解的详细内容,更多关于vite + electron-builder 打包配置的资料请关注脚本之家其它相关文章!

相关文章

  • Vue watch中监听值的变化,判断后修改值方式

    Vue watch中监听值的变化,判断后修改值方式

    这篇文章主要介绍了Vue watch中监听值的变化,判断后修改值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • Vue.js中组件中的slot实例详解

    Vue.js中组件中的slot实例详解

    这篇文章主要介绍了Vue.js中组件中的slot实例详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • 一文详解Vue3响应式原理

    一文详解Vue3响应式原理

    这篇文章主要介绍了一文详解Vue3响应式原理,文章通过与vue2.x 的响应式做对比详解展现出了Vue3响应式原理详情,感兴趣的小伙伴可以参考一下
    2022-06-06
  • 详解Vue如何实现字母验证码

    详解Vue如何实现字母验证码

    这篇文章主要为大家介绍了Vue如何实现字母验证码详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • 在VUE中实现文件下载并判断状态的方法

    在VUE中实现文件下载并判断状态的方法

    今天小编就为大家分享一篇在VUE中实现文件下载并判断状态的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • vue中静态文件引用的注意事项及说明

    vue中静态文件引用的注意事项及说明

    这篇文章主要介绍了vue中静态文件引用的注意事项及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • 深入解读VUE中的异步渲染的实现

    深入解读VUE中的异步渲染的实现

    这篇文章主要介绍了深入解读VUE中的异步渲染的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • el-table fixed固定列导致错位的解决方法介绍

    el-table fixed固定列导致错位的解决方法介绍

    ElementUI中el-table设置指定列固定不动,不受滚动条影响,下面这篇文章主要给大家介绍了关于el-table fixed固定列导致错位的解决方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • 高频率Vue面试题汇总以及答案

    高频率Vue面试题汇总以及答案

    vue是组件化开发框架,所以对于vue应用来说组件间的数据通信非常重要,下面这篇文章主要给大家介绍了关于高频率Vue面试题以及答案的相关资料,需要的朋友可以参考下
    2023-02-02
  • 使用vue自定义指令开发表单验证插件validate.js

    使用vue自定义指令开发表单验证插件validate.js

    今天就来介绍一下如何利用vue的自定义指令directive来开发一个表单验证插件的过程,需要的朋友可以参考下
    2019-05-05

最新评论