赞
踩
昨天用Vue+vite和electron做了一个俄罗斯方块游戏,然后写完踩了半天坑在打包上,今天把整个流程总结一下,因为只需要多点一个配置,一个vue项目就能变成一个app,非常大提高开发效率,实现了学会vue能用uniapp做安卓、ios、小程序,也能用electron做桌面应用。
本文无废话无原理,也是方便我以后忘了也能看。
四处搜索+gpt+文档得来的结果,为了演示我重新建了一个项目。
俄罗斯方块项目在这:
https://download.csdn.net/download/m0_73459939/89589427https://download.csdn.net/download/m0_73459939/89589427这是setup.exe文件,代码请看下篇文章。
创建vue项目就不多说了,反正就是用Vite创建,具体可以看我上一篇文章,但是需要注意的是打包的时候路由需要切换成哈希(带#的,等会打包再说)。
创建完项目后首先是下载electron,文档里面给的是yarn和npm,yarn我没试验过,反正npm和pnpm都是下载不了的,不知道是不是镜像源的问题,但是我用cnpm就没这个问题。
create完项目之后
- npm i cnpm
- cnpm install
- cnpm run dev
然后下载election。
cnpm install electron --save-dev
然后开始配置electron的东西。
在package.json里面修改,好像author和description是需要改的,但是这个问题不大。就加几个注释里面的,其他创建项目完都是有的。
- {
- "name": "election_demo",
- "version": "0.0.0",
- "private": true,
- "type": "module",
- "main": "main.js",//必须加上的
- "description": "Russia cubes",//文档要求加上
- "author": "Ye",//文档要求加上
- "scripts": {
- "dev": "vite",
- "build": "vite build",
- "preview": "vite preview",
- "start": "electron ."//这个必须加上
- },
- "dependencies": {
- "cnpm": "^9.4.0",
- "vue": "^3.4.29",
- "vue-router": "^4.3.3"
- },
- "devDependencies": {
- "@vitejs/plugin-vue": "^5.0.5",
- "electron": "^31.3.0",
- "vite": "^5.3.1"
- }
- }

接下来创建main.js(注意!!!不要在src文件夹下创建,要在和src同级的)
- main.js
-
-
- import { app, BrowserWindow } from 'electron'
- import path from 'path'
- import { fileURLToPath } from 'url'
- import { dirname } from 'path'
- const __filename = fileURLToPath(import.meta.url)
- const __dirname = dirname(__filename)
-
- function createWindow() {
- console.log('Creating window...')
- const mainWindow = new BrowserWindow({
- width: 950,
- height: 850,
- title: "Russia cubes",
- icon: '@/assets/logo.ico',
- autoHideMenuBar: true,
- webPreferences: {
- preload: path.join(__dirname, 'preload.js'),
- devTools: false,// 禁用开发者工具
- webSecurity: false
- },
- // 加载 index.html
-
- })
- // 加载开发服务器提供的 URL(如果使用)
- const devServerUrl = 'http://localhost:5173' // 根据你的开发服务器配置进行调整
- mainWindow
- .loadURL(devServerUrl)//还没打包之前用url,打包之后用index
- //.loadFile('./dist/index.html')
- .then(() => {
- console.log('Loaded URL:', devServerUrl)
- })
- .catch((err) => {
- console.error('Failed to load URL:', err)
- })
-
- // 删除或注释掉打开开发者工具的代码
- mainWindow.webContents.openDevTools();
- }
-
- app.whenReady().then(() => {
- console.log('App is ready')
- createWindow()
-
- app.on('activate', function () {
- if (BrowserWindow.getAllWindows().length === 0) createWindow()
- })
- })
-
- app.on('window-all-closed', function () {
- if (process.platform !== 'darwin') app.quit()
- })

因为冲突不大,所以我基本是在vue里面写用h5去debug,把这里的开发者工具给禁用掉了。
然后创建preload.js,一样在main.js同级。
- preload.js
-
- 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])
- }
- })
如果你问我为什么这样写,我也不知道,四处cv来的,能用。
到现在项目就能跑起来了。
- cnpm run dev
- cnpm run start
然后开发的活就各自干,两个之间互不冲突。
首先是打包文件(还没到打包成exe)
cnpm run build
然后有了一个dist文件之后就可以把main.js里面的load换掉了。
路由也要换一下,一般我们是用createWebHistory,但是这里我们得换成createWebHashHistory,不然就会一片空白或者404(如果做了*返回404页面的话)。
- import { createRouter, createWebHashHistory } from 'vue-router'
-
- const router = createRouter({
- history: createWebHashHistory(),//加上这一句或者改成createWebHashHistory
- routes: [
- {
- path: '/',
- component: () => import('@/views/Home/HomePage.vue')
- }
- ]
- })
-
- export default router
然后在vite.config.js里面加上这一句
全部加上完成之后再cnpm run build一次,因为得把你改的这些打包进去。然后就可以实现启动h5和启动electron各自独立了。
启动electron
cnpm run start
好了,接下来就是打包exe了,坑最多的地方。
首先是下载electron-builder。注意-D不能丢掉,如果丢掉的话需要去package.json把 "electron-builder": "^24.13.3"从dependencies移动到devDependencies再cnpm install electron-builder -D一次。
cnpm install electron-builder -D
在package.json里面启动的地方加一行
- "scripts": {
- "dev": "vite",
- "build": "vite build",
- "preview": "vite preview",
- "start": "electron .",
- "exe-build": "electron-builder"//加上这一句
- },
然后这个时候运行进行打包。
cnpm run exe-build
如果你是第一次的话,不用想太多,肯定是失败的,连接超时问题,开梯子、换镜像都一样。
根据你的错误提示,ctrl+链接可以直接下载(我下午配置过了,这里网上找几个图片,原理是一样的)。
图片来源:解决electron打包时,下载超时导致失败_electron打包时下载eletron超时-CSDN博客
其实是有三张图的,第一个是说electron下载失败,你可以直接ctrl这个链接下载,也可以记住版本后去github上下载。注意要对上版本。
Releases · electron/electron (github.com)https://github.com/electron/electron/releases这个是下载electron的地址,光下载electron还不够,还需要去找到对应版本的SHASUMS256.txt,然后一起放在C:\Users\Ye\AppData\Local\electron\Cache的地方。
第一个报错就解决了。
然后第二个和第三个(就是上面两张图片)来这里下载,也就是winCodeSign和nsis
Releases · electron-userland/electron-builder-binaries (github.com)https://github.com/electron-userland/electron-builder-binaries/releases?after=winCodeSign-2.2.0然后也是一样创建各自的文件夹和各自需要的东西,注意的是,这里不是C:\Users\Ye\AppData\Local\electron\Cache了,而是C:\Users\Ye\AppData\Local\electron-builder\Cache了。
winCodeSign只需要下载一项就行。而nisi有两项,有一个在下载地址的第二页。
在三个都下载好之后就会发现我们打包没问题了,也能成功出现exe文件了。
但是!不要高兴太早,现在去打开exe肯定就是一片空白。因为找不到文件,我感觉是没有打包进去。
我们再次来到package.json加上这段代码:
- "build": {
- "appId": "Ye.russiacubes",
- "files": [
- "dist/**/*",
- "main.js",
- "preload.js",
- "index.html",
- "src/**/*",
- "node_modules/**/*",
- "package.json"
- ],
- "asarUnpack": [
- "main.js",
- "preload.js"
- ],
- "win": {
- "icon": "src/assets/icon.ico",
- "target": [
- "nsis"
- ]
- },
- "nsis": {
- "oneClick": false,
- "allowToChangeInstallationDirectory": true
- }
- },

在这个层级
然后我们再次打包,运行一次cnpm run exe-build。
成功了!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。