1.安装脚手架vue-cli4;
安装脚手架
npm install -g @vue/cli
安装项目
vue create 项目名称
配置项目
Default ([Vue 2] babel, eslint) Default (Vue 3 Preview) ([Vue 3] babel, eslint) ❯ Manually select features
? Check the features needed for your project: ◉ Choose Vue version ◉ Babel ◯ TypeScript ◯ Progressive Web App (PWA) Support ◉ Router ◉ Vuex ❯◉ CSS Pre-processors ◉ Linter / Formatter ◯ Unit Testing ◯ E2E Testing
2.引入element-plus组件;
yarn add element-plus -S
3.引入electron到脚手架项目;
vue add electron-builder
选择最新的electron版本
? Choose Electron Version (Use arrow keys) ^10.0.0 ^11.0.0 ❯ ^12.0.0
配置vue.config.js,优化构建项目
const AutoImport = require('unplugin-auto-import/webpack')
const Components = require('unplugin-vue-components/webpack')
const { ElementPlusResolver } = require('unplugin-vue-components/resolvers')
const path = require('path')
const resolve = dir => path.join(__dirname, dir)
module.exports = {
configureWebpack: {
plugins: [
// 对element-plus组件进行tree-shaking配置
AutoImport({
resolvers: [ElementPlusResolver()]
}),
// 对element-plus组件进行tree-shaking配置
Components({
resolvers: [ElementPlusResolver()]
})
],
resolve: {
// 设置快捷路径, @ 表示 'src' ,components 表示 'src/components'
alias: {
'@': resolve('src'),
assets: resolve('src/assets'),
components: resolve('src/components'),
views: resolve('src/views')
}
}
},
pluginOptions: {
electronBuilder: {
builderOptions: {
win: {
icon: './src/assets/logo.ico'
},
mac: {
icon: './src/assets/logo.icns'
},
productName: 'GG文档'
}
}
}
}
根据项目需要配置background.js
'use strict'
import { app, protocol, BrowserWindow, Menu, screen } from 'electron'
import { createProtocol } from 'vue-cli-plugin-electron-builder/lib'
import installExtension, { VUEJS3_DEVTOOLS } from 'electron-devtools-installer'
const isDevelopment = process.env.NODE_ENV !== 'production'
// Scheme must be registered before the app is ready
protocol.registerSchemesAsPrivileged([
{ scheme: 'app', privileges: { secure: true, standard: true } }
])
async function createWindow () {
// 获取屏幕尺寸
const size = screen.getPrimaryDisplay().workAreaSize
const width = parseInt(size.width * 0.9)
const height = parseInt(size.height * 0.9)
// Create the browser window.
const win = new BrowserWindow({
width: width,
height: height,
webPreferences: {
// Use pluginOptions.nodeIntegration, leave this alone
// See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more info
nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION,
contextIsolation: !process.env.ELECTRON_NODE_INTEGRATION
},
icon: 'src/assets/img/logo.ico'
// titleBarStyle: 'hidden'
})
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 (!process.env.IS_TEST) win.webContents.openDevTools()
} else {
createProtocol('app')
// Load the index.html when not in development
win.loadURL('app://./index.html')
}
createMenu()
}
// Quit when all windows are closed.
app.on('window-all-closed', () => {
// On macOS it is common for applications and their menu bar
// to stay active until the user quits explicitly with Cmd + Q
if (process.platform !== 'darwin') {
app.quit()
}
})
app.on('activate', () => {
// On macOS it's common to re-create a window in the app when the
// dock icon is clicked and there are no other windows open.
if (BrowserWindow.getAllWindows().length === 0) createWindow()
})
// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on('ready', async () => {
if (isDevelopment && !process.env.IS_TEST) {
// Install Vue Devtools
try {
await installExtension(VUEJS3_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()
})
}
}
// 设置菜单栏
function createMenu () {
// darwin表示macOS,针对macOS的设置
if (process.platform === 'darwin') {
const template = [{
label: 'App Demo',
submenu: [
{ role: 'about' },
{
role: 'quit'
}]
}]
const menu = Menu.buildFromTemplate(template)
Menu.setApplicationMenu(menu)
} else {
// windows及linux系统
Menu.setApplicationMenu(null)
}
}
main.js配置
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import ElementPlus from 'element-plus'
import i18n from 'assets/lang/index.js'
createApp(App).use(ElementPlus).use(i18n).use(store).use(router).mount('#app')
国际化配置
/* eslint-disable camelcase */
import { createI18n } from 'vue-i18n'
import el_en from 'element-plus/es/locale/lang/en'
import el_zh from 'element-plus/es/locale/lang/zh-cn'
import zh from '@/assets/lang/zh'
import en from '@/assets/lang/en'
import Storage from '@/utils/storage.js'
const i18n = createI18n({
locale: Storage.localGet('locale') || 'zh-CN', // 语言标识, 通过切换locale的值来实现语言切换,this.$i18n.locale
messages: {
'zh-CN': Object.assign({ lang: zh }, el_zh), // 中文语言包
'en-US': Object.assign({ lang: en }, el_en) // 英文语言包
}
})
export default i18n
