Vue3 + Vite + Electron + TS 项目构建
效果图
1. 创建项目
运行命令,选择 vue + ts
pnpm create vite
2. 安装依赖
2.1 electron
pnpm add electron -D
2.2 electron-builder
打包工具
pnpm add electron-builder -D
2.3 electron-devtools-installer
开发工具
pnpm add electron-devtools-installer -D
2.4 vite-plugin-electron、vite-plugin-electron-renderer
集成 Vite 和 Electron,方便后续在渲染进程中使用 Node API 或 Electron API
pnpm add vite-plugin-electron -D
pnpm add vite-plugin-electron-renderer -D
2.5 rimraf
快速删除文件和文件夹
pnpm add rimraf -D
3. 创建 electron 窗口
根目录创建 electron 文件夹,创建 index.ts、preload.ts
3.1 编辑 index.ts
// electron-main/index.ts
import { app, BrowserWindow } from "electron";
import path from "path";
const createWindow = () => {
const win = new BrowserWindow({
webPreferences: {
contextIsolation: false, // 是否开启隔离上下文
nodeIntegration: true, // 渲染进程使用Node API
preload: path.join(__dirname, "./preload.js"), // 需要引用js文件
},
});
// 如果打包了,渲染index.html
if (process.env.NODE_ENV !== "development") {
win.loadFile(path.join(__dirname, "./index.html"));
win.webContents.openDevTools();
} else {
let url = "http://localhost:5173"; // 本地启动的vue项目路径。注意:vite版本3以上使用的端口5173;版本2用的是3000
win.loadURL(url);
win.webContents.openDevTools();
}
};
app.whenReady().then(() => {
createWindow(); // 创建窗口
app.on("activate", () => {
if (BrowserWindow.getAllWindows().length === 0) createWindow();
});
});
// 关闭窗口
app.on("window-all-closed", () => {
if (process.platform !== "darwin") {
app.quit();
}
});
3.2 编辑 preload.ts
// electron-preload/preload.ts
import os from "os";
console.log("platform", os.platform());
4. 编辑 tsconfig.app.json
将 electron 文件下的 ts 文件添加到编译
{
"compilerOptions": {
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
"target": "ES2020",
"useDefineForClassFields": true,
"module": "ESNext",
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "Bundler",
"allowImportingTsExtensions": true,
"isolatedModules": true,
"moduleDetection": "force",
"noEmit": true,
"jsx": "preserve",
/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true
},
"include": [
"src/**/*.ts",
"src/**/*.tsx",
"src/**/*.vue",
"electron/**/**.ts"
]
}
5. 编辑 vite.config.ts
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import electron from "vite-plugin-electron";
import electronRenderer from "vite-plugin-electron-renderer";
export default defineConfig(({ mode }) => ({
base: mode == "development" ? "" : "./",
plugins: [
vue(),
electron([
{
entry: "electron/index.ts", // 主进程文件
},
{
entry: "electron/preload.ts",
},
]),
electronRenderer(),
],
build: {
emptyOutDir: false, // 默认情况下,若 outDir 在 root 目录下,则 Vite 会在构建时清空该目录
outDir: "dist-electron",
},
}));
6. 编辑 package.json
{
"name": "electron-vue3-ts-vite",
"private": true,
"version": "0.0.0",
"main": "dist-electron/index.js",
"scripts": {
"dev": "vite",
"build": "vue-tsc -b && rimraf dist-electron && vite build && electron-builder",
"preview": "vite preview"
},
"dependencies": {
"vue": "^3.2.47"
},
"devDependencies": {
"@vitejs/plugin-vue": "^4.1.0",
"electron": "^25.2.0",
"electron-builder": "^24.4.0",
"electron-devtools-installer": "^3.2.0",
"rimraf": "^5.0.1",
"typescript": "^5.0.2",
"vite": "^4.3.9",
"vite-plugin-electron": "^0.12.0",
"vite-plugin-electron-renderer": "^0.14.5",
"vue-tsc": "^1.4.2"
},
"build": {
"appId": "com.electron.desktop",
"productName": "electron",
"asar": true,
"copyright": "Copyright © 2022 electron",
"directories": {
"output": "release/${version}"
},
"files": ["./dist", "./package.json", "./dist-electron"],
"mac": {
"artifactName": "${productName}_${version}.${ext}",
"target": ["dmg"]
},
"win": {
"target": [
{
"target": "nsis",
"arch": ["x64"]
}
],
"artifactName": "${productName}_${version}.${ext}"
},
"nsis": {
"oneClick": false,
"allowElevation": true,
"allowToChangeInstallationDirectory": true,
"installerIcon": "public/timg.ico",
"uninstallerIcon": "public/timg.ico",
"installerHeader": "public/timg.ico",
"installerHeaderIcon": "public/timg.ico",
"installerSidebar": "public/installerSiddebar.bmp",
"uninstallerSidebar": "public/uninstallerSiddebar.bmp",
"uninstallDisplayName": "${productName}${version}",
"createDesktopShortcut": true,
"createStartMenuShortcut": true,
"shortcutName": "TestApp",
"include": "script/installer.nsi",
"script": "script/installer.nsi",
"deleteAppDataOnUninstall": false,
"runAfterFinish": true,
"menuCategory": false
},
"publish": [
{
"provider": "generic",
"url": "http://127.0.0.1:8080"
}
],
"releaseInfo": {
"releaseNotes": "版本更新的具体内容"
}
}
}