Turn an existing Vue 2 project into an Electron project

  1. Install Electron and required packges
  2. Update vue.config.js
  3. Update background.js
  4. Run your electron app

Install Electron and required packges

First of all, make sure you have installed Vue CLI:

1
npm install -g @vue/cli

Install Electron and Electron builder in your project:

1
vue add electron-builder

Update vue.config.js

Create or update vue.config.js in the root of your project to include Electron Builder configuration.

1
2
3
4
5
6
7
8
9
10
11
module.exports = {
pluginOptions: {
electronBuilder: {
builderOptions: {
appId: "com.example.app",
productName: "My Vue Electron App",
// See more https://www.electron.build/configuration/configuration
},
},
},
};

Update background.js

Electron builder will create a file named background.js under the folder src as the main file. Modify this file when needed.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
"use strict";

import { app, protocol, BrowserWindow } from "electron";
import {
createProtocol,
/* installVueDevtools */
} from "vue-cli-plugin-electron-builder/lib";
import path from "path";

const isDevelopment = process.env.NODE_ENV !== "production";

// Scheme must be registered before the app is ready
protocol.registerSchemesAsPrivileged([
{ scheme: "app", privileges: { secure: true, standard: true } },
]);

async function createWindow() {
// Create the browser window.
const win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
// Use pluginOptions.nodeIntegration, leave this alone
contextIsolation: !process.env.ELECTRON_NODE_INTEGRATION,
enableRemoteModule: true,
preload: path.join(__dirname, "preload.js"),
},
});

if (process.env.WEBPACK_DEV_SERVER_URL) {
// Load the url of the dev server if in development mode
await win.loadURL(process.env.WEBPACK_DEV_SERVER_URL);
if (!process.env.IS_TEST) win.webContents.openDevTools();
} else {
createProtocol("app");
// Load the index.html when not in development
win.loadURL("app://./index.html");
}
}

// Quit when all windows are closed.
app.on("window-all-closed", () => {
// On macOS it is common for applications and their menu bar
// to stay active until the user quits explicitly with Cmd + Q
if (process.platform !== "darwin") {
app.quit();
}
});

app.on("activate", () => {
// On macOS it is common to re-create a window even after all windows have been closed
if (BrowserWindow.getAllWindows().length === 0) createWindow();
});

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on("ready", async () => {
if (isDevelopment && !process.env.IS_TEST) {
// Install Vue Devtools
try {
// await installVueDevtools()
} catch (e) {
console.error("Vue Devtools failed to install:", e.toString());
}
}
createWindow();
});

// Exit cleanly on request from parent process in development mode.
if (isDevelopment) {
if (process.platform === "win32") {
process.on("message", (data) => {
if (data === "graceful-exit") {
app.quit();
}
});
} else {
process.on("SIGTERM", () => {
app.quit();
});
}
}

Run your electron app

Finally, run your Electron app with the following command:

1
npm run electron:serve

To build your app:

1
npm run electron:build