electron-vue
vue3
electron快速入门
1、创建vue项目
vue create vue-electron
2、添加electron
vue add electron-builder
可能会卡顿或者下载不了,改变一下electron的镜源
vi ~/.npmrc
添加:
electron_mirror=https://npm.taobao.org/mirrors/electron/
看一下package.json
新建background.js文件,package.json中配置。
background.js中配置窗口的基本信息
import { app, protocol, BrowserWindow } from 'electron'
import { createProtocol } from 'vue-cli-plugin-electron-builder/lib'
const isDevelopment = process.env.NODE_ENV !== 'production'
protocol.registerSchemesAsPrivileged([
{ scheme: 'app', privileges: { secure: true, standard: true } }
])
async function createWindow() {
// Create the browser window.
const win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION,
contextIsolation: !process.env.ELECTRON_NODE_INTEGRATION,
enableRemoteModule: true,
}
})
if (process.env.WEBPACK_DEV_SERVER_URL) {
// Load the url of the dev server if in development mode
await win.loadURL(process.env.WEBPACK_DEV_SERVER_URL)
if (isDevelopment) {
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) {
}
createWindow()
})
if (isDevelopment) {
if (process.platform === 'win32') {
process.on('message', (data) => {
if (data === 'graceful-exit') {
app.quit()
}
})
} else {
process.on('SIGTERM', () => {
app.quit()
})
}
}
//打包
npm run electron:build
//调试/开发
npm run electron:serve
//用于在安装应用程序依赖时执行 electron-builder install-app-deps 命令,以确保安装的依赖包含必要的二进制文件
npm run postinstall
npm run electron:build会自动识别当前的操作系统,打出系统对应的安装包。 这也意味着,如果要生成exe\msi,需要在Windows操作系统,如果是dmg,则需要在Mac操作系统。
npm run electron:build 打包失败
1、项目路径中不能包含中文!!!!
2、先npm run build 再npm run electron:build
3、添加路由vue-router
npm install vue-router
新建router/index.js文件
1、使用createWebHashHistory,为什么呢?因为使用createWebHistory打包后跳转的路由空白。没研究出来为啥,有知道的可评论一下告诉我,感谢~
import { createRouter, createWebHashHistory } from 'vue-router'
const routes = [
{
path: '/homePage',
name: "homePage",
meta: {
title: "首页"
},
component: () => import('@/views/homePage.vue')
},
{ path: '/', redirect: '/homePage' },
{ path: '/:pathMatch(.*)',
component: () => import('@/views/homePage.vue')
},
{
path: '/mdProtocol',
meta: {
title: "订阅合约"
},
name: 'mdProtocol',
component: () => import('@/views/mdProtocol.vue')
},
]
const router = createRouter({
history: createWebHashHistory(),
routes
})
router.beforeEach((to, form, next) => {
if (to.meta.title) {
document.title = to.meta.title
}
next()
})
export default router
2、设置路由中的tittle,这是窗口的自定义标题,如果不使用路由,那使用
win.setTitle('标题')
3、main.js 中引入router
import { createApp } from 'vue'
import App from './App.vue'
import router from '@/router/index'
createApp(App).use(router).mount('#app')
4、app.vue中
4、打开多个窗口
使用ipcMain监听和ipcRenderer通知
在background.js文件中添加ipcMain。因为路由使用的hash模式,所以要注意win.loadURL中的要加上#哦,如下:
win.loadURL(winURL + '#' + data.filePath)
所有的代码如下:
import { app, protocol, BrowserWindow, ipcMain } from 'electron'
const isDevelopment = process.env.NODE_ENV !== 'production'
const winURL = isDevelopment ? process.env.WEBPACK_DEV_SERVER_URL : `file://${__dirname}/index.html/`
ipcMain.on('create-window', (e, data) => {
console.log('file', data.filePath)
let win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION,
contextIsolation: !process.env.ELECTRON_NODE_INTEGRATION,
enableRemoteModule: true,
// webSecurity: false
},
})
win.loadURL(winURL + '#' + data.filePath)
if (!process.env.IS_TEST) win.webContents.openDevTools()
})
在需要打开多窗口多页面使用ipcRenderer
<script setup>
const { ipcRenderer } = require('electron')
function openWin() {
ipcRenderer.send('create-window', { filePath: "mdProtocol" })
}
function openWin2() {
ipcRenderer.send('create-window', { filePath: "tdProtocol" })
}
</script>
效果如下: