本文搭建基于vue cli
提供的vue-cli-plugin-electron-builder进行脚手架搭建。html
electron的优势和缺点已经有各类分析了,这里再也不多述,若是你是一个前端开发,想把现有页面转化成桌面软件,而且能有win,mac,linux的版本,那么electron不失为一个好的选择,固然一个多端的框架优缺点都是很明显的,既然想快速开发那么就得舍弃点东西,好比体积大小,性能等等。前端
说到底electron本质上就是一个基于Chromium的应用,通俗点说,这个桌面软件就是一个浏览器,咱们写的东西在浏览器中展现,是否是一会儿就回到熟悉领域了,那么在开发前你得知道前端三驾马车 HTML, CSS 和 JavaScript,涉及到一些文件等的处理的话那么会有些许node的知识。vue
npm install -g @vue/cli vue create electron-vue # 自行选择vue版本,因为electron使用的是Chromium,那么咱们能够没必要考虑兼容性的问题,我这里直接选择vue3(看我的喜爱) cd electron-vue vue add electron-builder # 选择electron版本号,这里我选择的是`11.0.0` # 安装完成以后会有`src/background.js`文件,`package.json`中会多出几条electron的build及serve命令 npm run electron:serve # 稍等一下子(Vue Devtools首次安装问题)会有一个桌面窗口出现,ok安装就完成啦,接下来咱们对其进行改造。
改造前说明一下:electron开发和咱们普通的开发有所不一样,它是有两种进程的:主进程和渲染进程node
src/background.js
:管理全部渲染进程(怎么配置桌面软件,怎么打开桌面软件,怎么相互通讯等等)。npm run electron:serve
作了什么,其实就是相似先运行npm run serve
启动一个网页的端口并生成一个实时打包的js,而后经过electron的命令指定启动的js,用主进程载入网页的端口。
通俗点来讲,你能够理解为咱们开发的桌面软件是一个浏览器,主进程就是设置这个浏览器的样式(图标,大小等等),渲染进程就是浏览器打开的网页。linux
首先咱们在src
目录下新建两个文件夹src/main
、src/renderer
,这两个分别放主进程及渲染进程的文件,而后把src/background.js
放入src/main
中,而后重命名为index.js
,src
下其余文件放入src/renderer
中。
如今的结构以下:webpack
├─src # 源码目录 │ ├─main # 主进程目录 │ │ └─index.js # 主进程入口 │ └─renderer # 渲染进程文件夹 │ ├─assets │ ├─components │ ├─App.vue │ └─main.js # 渲染进程入口
因为咱们修改了默认的入口文件位置,咱们应该配置对应的参数,
在根目录新建vue.config.js
,添加git
module.exports = { pluginOptions: { electronBuilder: { mainProcessFile: 'src/main/index.js', // 主进程入口文件 rendererProcessFile: 'src/renderer/main.js', // 渲染进程入口文件 mainProcessWatch: ['src/main'], // 检测主进程文件在更改时将从新编译主进程并从新启动 } } }
而后从新npm run electron:serve
,看可否从新启动。 github
补充:若是是只打包单页electron的话这样配置没问题,可是这样的话想对web页面打包(npm run build)会有问题,由于咱们把入口文件位置修改了。
这里咱们能够经过设置pages来修改其入口文件,而且这样还能够打包多页web
module.exports = { pages: { index: { entry: 'src/renderer/main.js', template: 'public/index.html', filename: 'index.html', title: 'vue-cli-electron', chunks: ['chunk-vendors', 'chunk-common', 'index'] }, // loader: 'src/loader/main.js' // 多页loader页 }, pluginOptions: { electronBuilder: { mainProcessFile: 'src/main/index.js', // 主进程入口文件 mainProcessWatch: ['src/main'], // 检测主进程文件在更改时将从新编译主进程并从新启动 } } }
注:若是添加了pages,请把electronBuilder
里的rendererProcessFile
删除,两个都是web页面的入口,是互斥的。
尝试分别运行web的serve、build及electron的serve、build,看是否能成功运行(打包可能会由于网络缘由,下载electron包失败,若是未添加.npmrc
请参考结尾补充)。vue-cli
vue cli能够经过--mode xx
来读取.env.xx
设置环境变量参考,在根目录新建
.env # 本地开发 .env.dev # 打包dev .env.test # 打包test .env.prod # 打包prod .env: NODE_ENV=development VUE_APP_ENV=development VUE_APP_APPID=com.electron.electronVueDEV VUE_APP_PRODUCTNAME=electron开发 VUE_APP_VERSION=0.0.1 BASE_URL=/ 注:.env 的NODE_ENV设置development,其他打包的请设置production NODE_ENV: webpack运行的模式 VUE_APP_ENV:咱们本身使用的环境变量(经过这个判断咱们是什么环境),好比.env.test为VUE_APP_ENV=test,.env.prod为VUE_APP_ENV=production VUE_APP_APPID:electron的appId配置,com.electron.electronVueDEV,com.electron.electronVueTEST,com.electron.electronVue VUE_APP_PRODUCTNAME:electron的productName配置,electron开发,electron测试,··· VUE_APP_VERSION:electron的version配置
修改package.json
的scripts
,删除原来的打包命令,新增:
web的打包: "build:dev": "vue-cli-service build --mode dev", "build:test": "vue-cli-service build --mode test", "build:prod": "vue-cli-service build --mode prod", electron的打包: "build:dev:win32": "vue-cli-service electron:build --mode dev --win --ia32", "build:dev:win64": "vue-cli-service electron:build --mode dev --win --x64", "build:test:win32": "vue-cli-service electron:build --mode test --win --ia32", "build:test:win64": "vue-cli-service electron:build --mode test --win --x64", "build:prod:win32": "vue-cli-service electron:build --mode prod --win --ia32", "build:prod:win64": "vue-cli-service electron:build --mode prod --win --x64", "build:dev:mac": "vue-cli-service electron:build --mode dev --mac", "build:test:mac": "vue-cli-service electron:build --mode test --mac", "build:prod:mac": "vue-cli-service electron:build --mode prod --mac",
electron打包这里只配置了win32,win64,mac的打包,若是对其余模式的包有需求的请参考连接自行配置。
新增renderer/config/index.js
,
const env = process.env const config = { host: '', baseUrl: '' } Object.assign(config, env) // if (env.NODE_ENV === 'development') { // config.VUE_APP_ENV = 'test' // } if (config.VUE_APP_ENV === 'development') { config.host = 'http://192.168.148.174:8080' } else if (config.VUE_APP_ENV === 'test') { config.host = 'http://192.168.148.175:8080' } else if (config.VUE_APP_ENV === 'production') { config.host = 'http://192.168.148.176:8080' } export default config
本地开发切换环境,可使用上面注释的方法修改,也能够直接修改.env
文件的VUE_APP_ENV
。
src/renderer/App.vue
添加import cfg from '@/config'
,打印cfg
vue.config.js
添加
const path = require('path') function resolve(dir) { return path.join(__dirname, dir) } module.exports = { chainWebpack: (config) => { // 因为咱们修改了渲染进程目录,修改'@'的alias config.resolve.alias.set('@', resolve('src/renderer')) }, builderOptions: { appId: process.env.VUE_APP_APPID, productName: process.env.VUE_APP_PRODUCTNAME, extraMetadata: { name: process.env.VUE_APP_APPID.split('.').pop(), version: process.env.VUE_APP_VERSION }, asar: true, directories: { output: "dist_electron", buildResources: "build", app: "dist_electron/bundled" }, files: [ { filter: [ "**" ] } ], extends: null, electronVersion: "11.3.0", extraResources: [], electronDownload: { mirror: "https://npm.taobao.org/mirrors/electron/" }, dmg: { contents: [ { type: "link", path: "/Applications", x: 410, y: 150 }, { type: "file", x: 130, y: 150 } ] }, mac: { icon: "public/icons/icon.icns" }, nsis: { oneClick: false, perMachine: true, allowToChangeInstallationDirectory: true, warningsAsErrors: false, allowElevation: false, createDesktopShortcut: true, createStartMenuShortcut: true }, win: { target: "nsis", icon: "public/icons/icon.ico", requestedExecutionLevel: "highestAvailable" }, linux: { "icon": "public/icons" }, publish: { provider: "generic", url: "http://127.0.0.1" } } ............ }
builderOptions
是electron的打包配置,参考连接,以前打包的话因为网络缘由,下载electron包可能会下载失败或特慢,这里配置electronDownload
为淘宝源,原本electron的name及version是读取package.json
里面的值的,这里使用extraMetadata
把这两个值注入进package.json
,其余配置可自行修改。
打包是须要icons的,windows呢须要.ico,mac须要icns,你可使用icofx
进行生成(后续有时间的话会补充),这里呢我使用的是一个插件直接生成的
yarn add -D electron-icon-builder package.json添加 "icons": "electron-icon-builder --input=./public/icons/icon.png --output=public --flatten",
在public下新建icons文件夹,再把你的icon.png(512*512)放在里面,运行npm run icons
就会在icons里面生成对应的图片了。
最后:运行打包命令,分别打dev,test,prod包安装,打开软件查看打印的cfg是否正确。
若是使用npm install
或yarn install
出现错误时,通常来讲是网络问题,先删除node_modules
,而后在根目录新建.npmrc
文件,添加electron_mirror=https://npm.taobao.org/mirrors/electron/
,注意不要使用cnpm安装,可能会出现各类问题。