什么是 Vite?
Vite 是一个快速,免费的 Web 开发工具,主要用于原型开发、辅助调试和小型项目。它使用现代浏览器原生 ES 模块导入,可以更快地加载应用程序,并在开发时进行热更新。
什么是 Vue3?
Vue3 是一个现代化的 JavaScript 框架,旨在让您更轻松地构建大规模的应用程序。它提供了许多更新,包括提高了性能、更好地利用TypeScript、更简单的组合 API 和更好的优化。
什么是 TypeScript?
TypeScript 是一种类型安全且易于学习和使用的编程语言,它是 JavaScript 的超集。TypeScript 将 JavaScript 引入了类型系统,以帮助开发人员编写更安全和更可靠的代码,它提供了更好的工具支持和更好的代码块,有助于减少出错的可能性。
什么是 Electron?
Electron 是一个使用 Web 技术构建基于 Chromium 和 Node.js 的跨平台桌面应用程序的框架,可以使用 HTML、CSS 和 JavaScript 来构建桌面应用程序,并提供强大的 API 和工具。虽然 Electron 本身不依赖于任何特定的前端框架,但它越来越多地与 Vue3 一起使用。
什么是pnpm
pnpm是Node.js的一个包管理器,它可以用于替代npm和yarn。
初始化项目
首先,在你的计算机上安装最新的Node.js和pnpm。
创建一个新项目:
pnpm create vite my-project
安装依赖
cd my-project
pnpm install
pnpm add @types/node cross-env electron electron-builder vite-plugin-electron vite-plugin-electron-renderer -D
配置文件
vite.config.ts:
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import path from "path";
import electron from "vite-plugin-electron";
import electronRenderer from "vite-plugin-electron-renderer";
export default defineConfig({
resolve: {
alias: {
"@": path.resolve(__dirname, "./src"),
},
},
plugins: [
vue(),
electron([
{
entry: "electron/main/index.ts",
onstart(options) {
options.startup();
},
vite: {
build: {
outDir: "dist-electron/main",
},
},
},
{
entry: "electron/preload/index.ts",
onstart(options) {
options.reload();
},
vite: {
build: {
outDir: "dist-electron/preload",
},
},
},
]),
electronRenderer(),
],
});
package.json:
{
"name": "electron-test",
"private": true,
"version": "0.0.0",
"main": "dist-electron/main/index.js",
"scripts": {
"dev": "vite",
"build": "vue-tsc --noEmit && vite build && electron-builder",
"preview": "vite preview"
},
"dependencies": {
"element-plus": "^2.3.3",
"normalize.css": "^8.0.1",
"pinia": "^2.0.34",
"sortablejs": "^1.15.0",
"vue": "^3.2.47"
},
"devDependencies": {
"@types/node": "^18.15.11",
"@vitejs/plugin-vue": "^4.1.0",
"cross-env": "^7.0.3",
"electron": "^24.1.2",
"electron-builder": "^23.6.0",
"sass": "^1.62.0",
"typescript": "^4.9.3",
"vite": "^4.2.0",
"vite-plugin-electron": "^0.11.2",
"vite-plugin-electron-renderer": "^0.14.1",
"vue-tsc": "^1.2.0"
}
}
创建主进程
在Electron中,主进程是启动应用程序的部分,同时也是与系统进行交互的部分。在我们的项目中,我们将使用TypeScript编写主进程代码。
在项目根目录下创建一个新文件夹 electron/main 以及 electron/main/index.ts 文件,这是我们的主进程文件。
在 index.ts 文件中添加以下内容:
import { app, BrowserWindow } from "electron";
import path from "path";
const createWindow = () => {
const win = new BrowserWindow({
width: 1000,
height: 800,
show: false,
webPreferences: {
// contextIsolation: false, // 是否开启隔离上下文
// nodeIntegration: true, // 渲染进程使用Node API
preload: path.join(__dirname, "../preload/index.js"),
},
});
// 发布时需换成生产域名
win.loadURL(`http://localhost:5173/`);
// 等页面加载完打开
win.once("ready-to-show", () => {
win.show();
});
};
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代码相似,但在我们的窗口实例化中,我们使用了Vite提供的热重载机制。
创建预加载脚本
在项目根目录下创建一个新文件夹 electron/preload 以及 electron/preload/index.ts 文件,这是我们的主进程文件。
import { ipcRenderer, contextBridge } from "electron";
const showMsgBox = (args) => {
ipcRenderer.invoke("on-show-msg-box", args);
};
const save = (args) => {
ipcRenderer.invoke("on-save", args);
};
contextBridge.exposeInMainWorld("electronApi", {
save,
showMsgBox,
});
预加载(preload)脚本包含了那些执行于渲染器进程中,且先于网页内容开始加载的代码 。 这些脚本虽运行于渲染器的环境中,却因能访问 Node.js API 而拥有了更多的权限。
打包和部署应用程序
在项目根目录下创建一个electron-builder.json5文件,配置如下:
/**
* @see https://www.electron.build/configuration/configuration
*/
{
appId: "com.electron.desktop",
productName: "electron",
asar: true,
copyright: "Copyright © 2023 electron",
directories: {
output: "release/${version}",
},
files: ["dist-electron", "dist"],
mac: {
artifactName: "${productName}_${version}.${ext}",
target: ["dmg"],
},
win: {
target: [
{
target: "nsis",
arch: ["x64"],
},
],
artifactName: "${productName}_${version}.${ext}",
},
nsis: {
oneClick: false,
perMachine: false,
allowToChangeInstallationDirectory: true,
deleteAppDataOnUninstall: false,
},
}
完成开发后,我们可以通过以下命令来打包我们的应用程序:
pnpm build
结论
在本文中,我们介绍了如何使用 Vite、Vue3、TypeScript、Electron 和 pnpm 搭建、开发、打包和部署一个前端项目。这个技术栈能够为前端开发人员提供更好的性能、代码质量和编辑器支持。希望本文对你有所帮助!