如何搭建一个用vue编写桌面应用Electron的项目

1,015 阅读2分钟

1. 新建 vue 项目

注意:

  • 必须使用 vue-cli 3.x 以上版本
  • 不能使用histroy模式
  • 不能懒加载

2. 引入依赖

yarn add -D electron electron-builder vue-cli-plugin-electron-builder
vue add electron-builder

3. 添加脚本

package.json :

"electron:serve": "vue-cli-service electron:serve",
"electron:build": "vue-cli-service electron:build"

4. 创建入口文件

在 src 目录下新建 background.js

import { app, protocol, BrowserWindow } from 'electron'
import { createProtocol } from 'vue-cli-plugin-electron-builder/lib'
import installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-installer'
const isDevelopment = process.env.NODE_ENV !== 'production'

protocol.registerSchemesAsPrivileged([
  { scheme: 'app', privileges: { secure: true, standard: true } }
])
async function createWindow () {
  const win = new BrowserWindow({//窗口默认大小和一些配置项
    width: 800,
    height: 600,
    webPreferences: { //启用nodejs环境(electron升级到5.0之后默认关闭)
      nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION
    }
  })
  if (process.env.WEBPACK_DEV_SERVER_URL) {
    await win.loadURL(process.env.WEBPACK_DEV_SERVER_URL)
    if (!process.env.IS_TEST) win.webContents.openDevTools()//是否打开控制台
  } else {
    createProtocol('app')
    win.loadURL('app://./index.html')//打开某个链接或者文件
  }
}
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()//杀死进程,也就是关闭窗口
  }
})

app.on('activate', () => {//激活
  if (BrowserWindow.getAllWindows().length === 0) createWindow()
})
app.on('ready', async () => {
  if (isDevelopment && !process.env.IS_TEST) {
    try {
      await installExtension(VUEJS_DEVTOOLS)
    } 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()
    })
  }
}  

5. 引入入口文件

package.json :

"main": "background.js"

6. 运行项目

yarn electron:serve

7. 打包项目

yarn electron:build

8. 可能出现的问题及解决办法

查看 vue-cli 版本 vue -V 或者 vue --version
如果 vue-cli 版本是 3.x 以下,运行的时候会报错:
'vue-cli-service' 不是内部或外部命令,也不是可运行的程序或批处理文件... image.png

installVueDevtools image.png installVueDevtools 是安装并显示 vue-devtools 的方法,已经分离出来了,需要换种方法引入

import installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-installer'

histroy 如果路由是 histroy 模式,打包之后,页面不能显示 里面的初始页面,而且刷新后显示空白。
改成 hash 就可以了。

跨域问题 方法1:后端解决 方法2:设置 webSecurity: false

const win = new BrowserWindow({//窗口默认大小和一些配置项
    width: 800,
    height: 700,
    webPreferences: { //启用nodejs环境(electron升级到5.0之后默认关闭)
      nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION,
      webSecurity: false
    }
  })

方法3:setProxy(尝试过,but没起作用)