Electron + Vite + Vue 3 实践手册

1,168 阅读9分钟

引言

嗨,亲爱的开发者们!在这个快节奏的世界里,我们总是在寻找更快、更高效的方式来构建我们的应用。今天,我要带你一起探索如何使用 Electron、Vite 和 Vue 3 来创建一个跨平台的桌面应用。这不仅仅是一个技术堆栈的简单组合,这是一个强大的工具集合,可以让你的应用在 Windows、macOS 和 Linux 上运行得飞起。

1. 先决条件

在我们开始之前,确保你的开发环境已经准备就绪。你需要:

  • Node.js:这是运行 JavaScript 的 runtime 环境。你可以从 Node.js 官网 下载并安装最新稳定版。
  • npm 或 yarn:作为 Node.js 的包管理器,npm 会随 Node.js 自动安装。你也可以选择使用 yarn,它提供了更快的包安装速度和更好的锁定机制。
  • Git:一个版本控制系统,可以帮助你管理代码变更。你可以从 Git 官网 下载安装。

2. 项目初始化

现在,让我们开始创建我们的项目。打开你的终端或命令提示符,输入以下命令:

# 创建一个新的文件夹来存放项目
mkdir my-electron-vue-app
# 进入这个文件夹
cd my-electron-vue-app
# 初始化项目
npm init vite@latest -- --template electron-vue3

或者如果你更喜欢使用 yarn:

# 创建一个新的文件夹来存放项目
mkdir my-electron-vue-app
# 进入这个文件夹
cd my-electron-vue-app
# 初始化项目
yarn create vite --template electron-vue3

这个命令会创建一个新的项目,并使用 Vite 的 Electron + Vue 3 模板。这个模板为我们提供了一个基本的项目结构,让我们可以快速开始开发。

3. 项目结构

初始化完成后,你的项目结构应该如下所示:

my-electron-vue-app
├── electron-main
│   └── main.js
├── src
│   ├── assets
│   ├── components
│   ├── App.vue
│   ├── main.js
├── package.json
├── vite.config.js
└── tsconfig.json
  • electron-main 文件夹:存放 Electron 主进程的代码。
  • src 文件夹:存放 Vue 应用的代码。
  • vite.config.js:Vite 的配置文件,用于定义构建和开发服务器的配置。
  • tsconfig.json:TypeScript 配置文件,如果你的项目使用 TypeScript,这个文件定义了 TypeScript 的编译选项。

4. 开发 Electron 主进程

Electron 主进程负责管理应用的窗口、菜单等。我们先来看看 electron-main/main.js

// 引入必要的模块
const { app, BrowserWindow } = require('electron');
const path = require('path');
const isDev = require('electron-is-dev');

// 保持对 window 对象的全局引用
let mainWindow;

function createWindow() {
  // 创建浏览器窗口
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js'),
      contextIsolation: true,
    },
  });

  // 并且加载应用的 index.html
  const startUrl = isDev ? 'http://localhost:3000' : `file://${path.join(__dirname, '../dist/index.html')}`;
  mainWindow.loadURL(startUrl);

  // 在 window 被关闭后,将其从内存中删除
  mainWindow.on('closed', function () {
    mainWindow = null;
  });
}

// 当 Electron 完成初始化并准备好创建浏览器窗口时,调用此函数
app.on('ready', createWindow);

// 所有窗口关闭时退出应用
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

app.on('activate', () => {
  // 在 macOS 上,当点击 dock 图标并且没有其他窗口打开时,
  // 通常会在应用中重新创建一个窗口
  if (BrowserWindow.getAllWindows().length === 0) {
    createWindow();
  }
});

这段代码做了几件事:

  1. 引入 Electron 和 Node.js 的模块。
  2. 创建一个浏览器窗口,并加载本地的 Vue 应用。
  3. 监听窗口和应用的事件。

4.1 理解主进程代码

让我们更深入地理解一下这段代码:

  • BrowserWindow 是 Electron 中用于创建窗口的类。
  • webPreferences 定义了窗口的一些行为,比如是否允许 Node.js 集成、是否启用上下文隔离等。
  • preload.js 是一个脚本,它在渲染进程加载之前运行,用于暴露一些安全的 Node.js 功能给渲染进程。
  • isDev 是一个判断当前是否处于开发模式的变量,它根据环境变量来判断。

4.2 创建窗口

createWindow 函数中,我们创建了一个窗口,并设置了它的大小和一些偏好设置。然后,我们根据是否处于开发模式来决定加载本地服务器的 URL 还是打包后的 HTML 文件。

5. 开发 Vue 应用

接下来,我们来开发 Vue 应用。在 src/main.js 中,我们初始化 Vue 应用:

import { createApp } from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';

const app = createApp(App);

app.use(store);
app.use(router);

app.mount('#app');

这里我们创建了一个 Vue 应用,并将其挂载到 #app 元素上。同时,我们引入了 Vue Router 和 Vuex,这两个库分别用于应用的路由管理和状态管理。

5.1 使用 Vue Router

Vue Router 是 Vue.js 的官方路由管理器。在 src/router/index.js 中,我们可以定义应用的路由:

import { createRouter, createWebHistory } from 'vue-router';
import Home from '../views/Home.vue';

const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home,
  },
  // 其他路由...
];

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes,
});

export default router;

这里我们定义了一个简单的路由,指向 Home 组件。

5.2 使用 Vuex

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式和库。在 src/store/index.js 中,我们可以定义应用的状态管理:

import { createStore } from 'vuex';

export default createStore({
  state: {
    count: 0,
  },
  mutations: {
    increment(state) {
      state.count++;
    },
  },
  actions: {
    increment(context) {
      context.commit('increment');
    },
  },
});

这里我们定义了一个简单的状态 count 和一个 increment 动作,用于增加 count 的值。

6. 添加 Vue 组件

src/components 文件夹中,你可以添加 Vue 组件。比如,我们创建一个简单的计数器组件:

src/components/Counter.vue

<template>
  <div>
    <button @click="decrement">-</button>

    <span>{{ count }}</span>

    <button @click="increment">+</button>

  </div>

</template>

<script>
export default {
  data() {
    return {
      count: 0,
    };
  },
  methods: {
    increment() {
      this.count++;
    },
    decrement() {
      this.count--;
    },
  },
};
</script>

然后在 src/App.vue 中使用这个组件:

<template>
  <div id="app">
    <Counter />
  </div>

</template>

<script>
import Counter from './components/Counter.vue';

export default {
  components: {
    Counter,
  },
};
</script>

7. 使用 Vite 开发

Vite 是一个现代化的前端构建工具,它提供了快速的冷启动和热更新。在项目根目录下,运行以下命令来启动开发服务器:

npm run dev

或者如果你使用 yarn:

yarn dev

这个命令会启动 Electron 和 Vue 应用的开发服务器。当你在开发过程中修改代码时,Vite 会自动重新编译并刷新浏览器窗口,让你可以实时看到更改的效果。

7.1 Vite 的优势

Vite 有几个显著的优势:

  • 快速的冷启动:Vite 使用原生 ES 模块导入特性,使得项目启动速度非常快。
  • 热更新:Vite 支持热更新,这意味着在开发过程中,当你修改代码时,浏览器会自动刷新,无需手动刷新。
  • 支持 TypeScript 和 JSX:Vite 原生支持 TypeScript 和 JSX,无需额外配置。

7.2 Vite 配置

vite.config.js 文件中,你可以配置 Vite 的行为。比如,你可以添加别名、定义环境变量等:

import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import electronRenderer from 'vite-plugin-electron-renderer';

export default defineConfig({
  plugins: [
    vue(),
    electronRenderer(),
  ],
  resolve: {
    alias: {
      '@': '/src',
    },
  },
  define: {
    'process.env': process.env,
  },
});

这里我们定义了两个插件:vueelectronRenderervue 插件用于支持 Vue 单文件组件,electronRenderer 插件用于配置 Electron 渲染进程的 Vite 行为。

8. 打包应用

当你的应用开发完成后,你可以使用 Vite 来打包应用。在项目根目录下,运行以下命令:

npm run build

或者如果你使用 yarn:

yarn build

这个命令会生成一个 dist 文件夹,里面包含了打包后的 Electron 应用。你可以将这个文件夹中的内容复制到你的发布目录中。

8.1 打包配置

vite.config.js 中,你可以配置打包的行为。比如,你可以定义输出目录、设置环境变量等:

import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import electronRenderer from 'vite-plugin-electron-renderer';

export default defineConfig({
  plugins: [
    vue(),
    electronRenderer(),
  ],
  build: {
    outDir: 'dist',
    sourcemap: true,
  },
  resolve: {
    alias: {
      '@': '/src',
    },
  },
  define: {
    'process.env': process.env,
  },
});

这里我们定义了输出目录为 dist,并启用了源映射,这有助于调试打包后的应用。

9. 发布应用

发布 Electron 应用通常涉及到打包应用、生成安装程序和分发安装程序。你可以使用一些工具来简化这个过程:

  • Electron Forge:一个完整的工具链,用于打包和发布 Electron 应用。
  • Electron Builder:一个强大的打包工具,支持多种平台和配置。

9.1 使用 Electron Forge

Electron Forge 提供了一个简单的命令行界面来管理 Electron 应用的打包和发布。首先,你需要安装 Electron Forge:

npm install --save-dev @electron-forge/cli

或者如果你使用 yarn:

yarn add --dev @electron-forge/cli

然后,你可以通过以下命令来初始化 Electron Forge 配置:

npx electron-forge import

接下来,你可以使用以下命令来打包和发布你的应用:

npx electron-forge make

这个命令会生成平台特定的安装程序。

9.2 使用 Electron Builder

Electron Builder 是一个流行的打包工具,它支持多种平台和配置。首先,你需要安装 Electron Builder:

npm install --save-dev electron-builder

或者如果你使用 yarn:

yarn add --dev electron-builder

然后,你可以在 package.json 中配置 Electron Builder:

{
  "build": {
    "appId": "com.example.myapp",
    "productName": "MyApp",
    "directories": {
      "output": "dist"
    },
    "files": [
      "dist/**/*",
      "node_modules/**/*",
      "electron-main/**/*"
    ],
    "mac": {
      "icon": "build/icons/icon.icns"
    },
    "win": {
      "icon": "build/icons/icon.ico"
    },
    "linux": {
      "icon": "build/icons"
    }
  }
}

接下来,你可以使用以下命令来打包和发布你的应用:

npm run build

这个命令会生成平台特定的安装程序。

10. 常见问题解答

Q: Electron 应用启动太慢怎么办?

A: 你可以尝试优化 Electron 主进程和渲染进程的代码,减少启动时的计算量。此外,使用 Vite 的热更新功能也可以加快开发时的反馈速度。

Q: 如何调试 Electron 应用?

A: 你可以在 Electron 主进程和渲染进程中使用 console.log 来输出调试信息。此外,使用 Chrome DevTools 也可以方便地调试渲染进程。

Q: 如何发布 Electron 应用?

A: 你可以使用 Electron Forge 或 Electron Builder 等工具来打包并发布你的 Electron 应用。

11. 总结回顾

今天我们详细介绍了如何使用 Electron、Vite 和 Vue 3 来开发跨平台的桌面应用。我们从项目初始化开始,一步步介绍了项目结构、开发 Electron 主进程、开发 Vue 应用、使用 Vite 开发、打包应用以及常见问题的解决办法。

通过这篇文章,你应该对 Electron + Vite + Vue 3 的开发有了基本的了解。赶紧动手试试,开发你自己的桌面应用吧!如果有任何问题,欢迎在评论区交流。祝你开发愉快!

12. 参考资料

希望这篇文章能帮助你快速上手 Electron + Vite + Vue 3 的开发。如果你有任何问题或建议,欢迎随时告诉我。祝你编程愉快!


好了,我们聊了这么久,相信你对 Electron + Vite + Vue 3 的开发已经有了一个全面的了解。这个技术栈真的很强大,能够让你快速构建出功能丰富的桌面应用。希望这篇文章能够帮助你入门,并激发你去探索更多的可能性。记得动手实践是学习新技术的最好方式,所以不要犹豫,赶紧开始你的项目吧!

如果你在开发过程中遇到任何问题,或者有其他想要了解的内容,欢迎随时告诉我。我会尽我所能帮助你的。再次感谢你的阅读,祝你开发顺利!