vue项目使用electron打包桌面应用程序 exe

淩亂°似流年 2022-11-11 05:09 528阅读 0赞

客户需求,要求vue做一个桌面应用,很久没碰vue了,这里简单记录下。

我是用Hbulider X 创建的vue项目,electron打包vue项目为桌面应用。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JyaWdodDIwMTc_size_16_color_FFFFFF_t_70

目录结构:

20210319100415576.png

打包之前需要简单创建几个vue界面,同时安装axios和router,让页面可以正常跑起来。

main.js

  1. import Vue from 'vue';
  2. import App from './App.vue';
  3. import VueRouter from 'vue-router';
  4. import axios from 'axios';
  5. import index from './components/index/index';
  6. import login from './components/login/login';
  7. import register from './components/register/register';
  8. Vue.use(VueRouter); //全局注册路由
  9. Vue.config.productionTip = false;
  10. // 避免每个页面引入axios,所以全局注册
  11. Vue.prototype.axios = axios;
  12. /* 定义路由页面 */
  13. const routes = [
  14. // 这里 path: '/' 代表应用首页显示的内容
  15. {
  16. path: '/',
  17. component: index
  18. },
  19. {
  20. path: '/login',
  21. component: login
  22. },
  23. {
  24. path: '/register',
  25. component: register
  26. }
  27. ];
  28. const router = new VueRouter({
  29. routes
  30. });
  31. new Vue({
  32. router,
  33. render: h => h(App),
  34. }).$mount('#app')

当前的package.json

  1. {
  2. "name": "web_desktop",
  3. "version": "0.1.0",
  4. "private": true,
  5. "scripts": {
  6. "serve": "vue-cli-service serve",
  7. "build": "vue-cli-service build"
  8. },
  9. "dependencies": {
  10. "axios": "^0.21.1",
  11. "core-js": "^2.6.5",
  12. "vue": "^2.6.10",
  13. "vue-router": "^3.5.1"
  14. },
  15. "devDependencies": {
  16. "@vue/cli-plugin-babel": "^3.8.0",
  17. "@vue/cli-service": "^3.8.0",
  18. "babel-preset-es2015": "^6.24.1",
  19. "vue-template-compiler": "^2.6.10"
  20. }
  21. }

根目录下需要创建一个 vue.config.js 为了防止页面一片空白,这里需要设置路径

  1. module.exports = {
  2. publicPath: "./"
  3. }

接下来 npm run serve 跑起来

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JyaWdodDIwMTc_size_16_color_FFFFFF_t_70 1

ok、运行正常、没有报错、数据请求正常

接下来开始研究打包、之前接触过一个神器:electron

所以这里我们也可以用它,在vue中下载一个插件 vue-cli-plugin-electron-builder

package.json中添加一句、然后执行 npm install 安装,记得先删除 node_modules 、npm如果太慢建议使用cnpm 、记得下载淘宝镜像

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JyaWdodDIwMTc_size_16_color_FFFFFF_t_70 2

  1. "devDependencies": {
  2. "@vue/cli-plugin-babel": "^3.8.0",
  3. "@vue/cli-service": "^3.8.0",
  4. "electron": "6.0.0",
  5. "babel-preset-es2015": "^6.24.1",
  6. "vue-cli-plugin-electron-builder": "^1.4.0",
  7. "vue-template-compiler": "^2.6.10"
  8. }

因为要打包成桌面应用exe、那么一定需要exe的一些设置,package.json中新增mani:background.js

  1. "main": "background.js",

这里build.js是桌面应用的窗口的一些设置,包括宽高、菜单栏、图标等。

此时package.json完整代码

  1. {
  2. "name": "web_desktop",
  3. "version": "0.1.0",
  4. "private": true,
  5. "scripts": {
  6. "serve": "vue-cli-service serve",
  7. "build": "vue-cli-service build"
  8. },
  9. "main": "background.js",
  10. "dependencies": {
  11. "axios": "^0.21.1",
  12. "core-js": "^2.6.5",
  13. "vue": "^2.6.10",
  14. "vue-router": "^3.5.1"
  15. },
  16. "devDependencies": {
  17. "@vue/cli-plugin-babel": "^3.8.0",
  18. "@vue/cli-service": "^3.8.0",
  19. "babel-preset-es2015": "^6.24.1",
  20. "vue-cli-plugin-electron-builder": "^1.4.0",
  21. "vue-template-compiler": "^2.6.10"
  22. }
  23. }

background.js完整代码

  1. import {
  2. app,
  3. protocol,
  4. BrowserWindow
  5. } from 'electron'
  6. import {
  7. createProtocol,
  8. installVueDevtools
  9. } from 'vue-cli-plugin-electron-builder/lib'
  10. const isDevelopment = process.env.NODE_ENV !== 'production'
  11. let win
  12. protocol.registerSchemesAsPrivileged([{
  13. scheme: 'app',
  14. privileges: {
  15. secure: true,
  16. standard: true
  17. }
  18. }])
  19. function createWindow() {
  20. win = new BrowserWindow({
  21. width: 800,
  22. height: 600,
  23. webPreferences: {
  24. nodeIntegration: true
  25. }
  26. })
  27. if (process.env.WEBPACK_DEV_SERVER_URL) {
  28. win.loadURL(process.env.WEBPACK_DEV_SERVER_URL)
  29. if (!process.env.IS_TEST) win.webContents.openDevTools()
  30. } else {
  31. createProtocol('app')
  32. win.loadURL('app://./index.html')
  33. }
  34. win.on('closed', () => {
  35. win = null
  36. })
  37. }
  38. app.on('window-all-closed', () => {
  39. if (process.platform !== 'darwin') {
  40. app.quit()
  41. }
  42. })
  43. app.on('activate', () => {
  44. if (win === null) {
  45. createWindow()
  46. }
  47. })
  48. app.on('ready', async () => {
  49. if (isDevelopment && !process.env.IS_TEST) {
  50. }
  51. createWindow()
  52. })
  53. if (isDevelopment) {
  54. if (process.platform === 'win32') {
  55. process.on('message', data => {
  56. if (data === 'graceful-exit') {
  57. app.quit()
  58. }
  59. })
  60. } else {
  61. process.on('SIGTERM', () => {
  62. app.quit()
  63. })
  64. }
  65. }

接下来,需要设置下 vue.config.js 打包的配置、我这里只需要64位的,

  1. module.exports = {
  2. publicPath: "./",
  3. pluginOptions: {
  4. electronBuilder: {
  5. builderOptions: {
  6. "win": { //win相关配置
  7. "icon": "ui.ico", //图标,当前图标在根目录下,
  8. "target": [{
  9. "target": "nsis", //利用nsis制作安装程序
  10. "arch": [
  11. "x64" //64位
  12. ]
  13. }]
  14. }
  15. }
  16. }
  17. }
  18. }

接下来要去打包,需要先在 package.json 中写两个命令

  1. "electron:build": "vue-cli-service electron:build",
  2. "electron:serve": "vue-cli-service electron:serve"

此时 package.json 的完整代码

  1. {
  2. "name": "web_desktop",
  3. "version": "0.1.0",
  4. "private": true,
  5. "scripts": {
  6. "serve": "vue-cli-service serve",
  7. "build": "vue-cli-service build",
  8. "electron:build": "vue-cli-service electron:build",
  9. "electron:serve": "vue-cli-service electron:serve"
  10. },
  11. "main": "background.js",
  12. "dependencies": {
  13. "axios": "^0.21.1",
  14. "core-js": "^2.6.5",
  15. "vue": "^2.6.10",
  16. "vue-router": "^3.5.1"
  17. },
  18. "devDependencies": {
  19. "@vue/cli-plugin-babel": "^3.8.0",
  20. "@vue/cli-service": "^3.8.0",
  21. "babel-preset-es2015": "^6.24.1",
  22. "vue-cli-plugin-electron-builder": "^1.4.0",
  23. "vue-template-compiler": "^2.6.10"
  24. }
  25. }

接下来、开始打包 执行命令 npm run electron:build

打包前可以先执行预览看看 npm run electron:serve

打包成功

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JyaWdodDIwMTc_size_16_color_FFFFFF_t_70 3watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JyaWdodDIwMTc_size_16_color_FFFFFF_t_70 4

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JyaWdodDIwMTc_size_16_color_FFFFFF_t_70 5

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JyaWdodDIwMTc_size_16_color_FFFFFF_t_70 6

安装到桌面

20210319112923447.png

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JyaWdodDIwMTc_size_16_color_FFFFFF_t_70 7

应用名称和打开后左上角的名称需要在代码中修改

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JyaWdodDIwMTc_size_16_color_FFFFFF_t_70 8

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JyaWdodDIwMTc_size_16_color_FFFFFF_t_70 9

这里需要注意、名称不能是中文否则会报错、如果需要中文名称怎么办、需要更改配置 、还记得 vue.config.js 吗

  1. "productName": "桌面应用",

vue.config.js 的完整代码

  1. module.exports = {
  2. publicPath: "./",
  3. pluginOptions: {
  4. electronBuilder: {
  5. builderOptions: {
  6. "productName": "桌面应用", //项目名,也是生成的安装文件名 桌面应用.exe
  7. "win": { //win相关配置
  8. "icon": "ui.ico", //图标,当前图标在根目录下,注意这里有两个坑
  9. "target": [{
  10. "target": "nsis", //利用nsis制作安装程序
  11. "arch": [
  12. "x64" //64位
  13. ]
  14. }]
  15. }
  16. }
  17. }
  18. }
  19. }

修改名称之后重新打包

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JyaWdodDIwMTc_size_16_color_FFFFFF_t_70 10

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JyaWdodDIwMTc_size_16_color_FFFFFF_t_70 11

到此为止基本就搞定了!

但是有几个地方需要注意,一个是打包之后的优化、

打包成功之后,打开应用后、左上角的图标可能会不显示、

这里ico 格式简单说下,我之前的ico是256*256的、但是有点大 264kb、压缩到100kb以内后、左上角图标可以正常显示了。

第二个需要优化的,就是左上角的菜单栏、我这里不需要显示

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JyaWdodDIwMTc_size_16_color_FFFFFF_t_70 12

这里需要在 background.js 中设置

  1. const electron = require('electron')
  2. const Menu = electron.Menu
  3. Menu.setApplicationMenu(null)

此时 background.js 完整代码

  1. import {
  2. app,
  3. protocol,
  4. BrowserWindow
  5. } from 'electron'
  6. import {
  7. createProtocol,
  8. installVueDevtools
  9. } from 'vue-cli-plugin-electron-builder/lib'
  10. const isDevelopment = process.env.NODE_ENV !== 'production'
  11. let win
  12. protocol.registerSchemesAsPrivileged([{
  13. scheme: 'app',
  14. privileges: {
  15. secure: true,
  16. standard: true
  17. }
  18. }])
  19. const electron = require('electron')
  20. const Menu = electron.Menu
  21. function createWindow() {
  22. // 这句话的作用是关闭窗口左上角的菜单栏
  23. Menu.setApplicationMenu(null)
  24. win = new BrowserWindow({
  25. width: 800,
  26. height: 600,
  27. icon: 'ui.ico',
  28. webPreferences: {
  29. nodeIntegration: true
  30. }
  31. })
  32. if (process.env.WEBPACK_DEV_SERVER_URL) {
  33. win.loadURL(process.env.WEBPACK_DEV_SERVER_URL)
  34. if (!process.env.IS_TEST) win.webContents.openDevTools()
  35. } else {
  36. createProtocol('app')
  37. win.loadURL('app://./index.html')
  38. }
  39. win.on('closed', () => {
  40. win = null
  41. })
  42. }
  43. app.on('window-all-closed', () => {
  44. if (process.platform !== 'darwin') {
  45. app.quit()
  46. }
  47. })
  48. app.on('activate', () => {
  49. if (win === null) {
  50. createWindow()
  51. }
  52. })
  53. app.on('ready', async () => {
  54. if (isDevelopment && !process.env.IS_TEST) {
  55. }
  56. createWindow()
  57. })
  58. if (isDevelopment) {
  59. if (process.platform === 'win32') {
  60. process.on('message', data => {
  61. if (data === 'graceful-exit') {
  62. app.quit()
  63. }
  64. })
  65. } else {
  66. process.on('SIGTERM', () => {
  67. app.quit()
  68. })
  69. }
  70. }

优化之后的样子

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JyaWdodDIwMTc_size_16_color_FFFFFF_t_70 13

接下来就是我在打包过程中遇到的比较难受的问题、资源下载的时候要么速度特别慢、要么就是被远程连接强制关闭,github访问的问题也不是一两天了,我比较倒霉吧,别说下载了,打都打不开。

各种搜索,终于在一位大神的博客下找到了下载链接。

加速下载 electron 下载链接

各个依赖包下载路径及安装位置

直接将下载好的文件解压在路径下

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JyaWdodDIwMTc_size_16_color_FFFFFF_t_70 14 watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JyaWdodDIwMTc_size_16_color_FFFFFF_t_70 15

下载依赖路径这里参考了一位大佬的博客,完美的解决了我的问题

大佬博客地址:https://juejin.cn/post/6844903873438547976

发表评论

表情:
评论列表 (有 0 条评论,528人围观)

还没有评论,来说两句吧...

相关阅读