Electron实战一
参考文章:
【1】.Electron构建跨平台应用Mac/Windows/Linux
【2】.Quick Start
【3】.electron 如何打开开发者工具 devtools ,如何进入开发者模式
1.安装Electron+Vue开发环境
首先就是要完成开发环境的搭建工作,不用说,肯定要安装nodejs和npm,然后安装vue-cli3.0,安装vue-cli-plugin-electron-builder插件,关于这个插件的使用和安装,听折腾的,详情请收看我的另一篇文章: electron结合vue进行开发 这里面详细说明了我在win10上安装和启动electron和vue-cli3.0遇到的一系列的问题和解决方法。安装和启动成功之后,就可以使用vue进行开发了。把vue-cli3.0默认生成的Home和About删除。
2.Normalize.css
这个标准化css样式文件,我觉得还是有必要的,文件不大,但是可以屏蔽各种浏览器的差异化。官网上给出的安装方式,在我这里报错。
1 | //错误安装 |
3.设置圆角边框
在background.js文件中,修改窗口设置将其设置为透明,然后编写界面的css,body不要设置背景色,增加border-radius,并且要注意:关闭调试模式,否则看不出效果来。
1 | win = new BrowserWindow({ width: 800, height: 600,frame: false, |
4.添加可拖拽
主要是为可拖拽区域设置 -webkit-app-region: drag;对不可拖拽的元素设置 -webkit-app-region: no-drag;
1.electron 教程【2】实现拖动无边框窗口
5.自定义标题栏(进程通讯)
将窗口设置为透明窗体,然后通过添加html标签,在新建的html中创建标题栏,然后自定义添加自定义的放大、缩小和关闭按钮,渲染进程通过ipcRender.send发送事件给主进程,主进程通过ipcMain.on监听渲染进程发送的消息,执行想关的窗口放大、缩小、关闭事件。
主进程 (Main Process)
一个 Electron 应用只有 一个主进程。当我们执行 electron . 命令后, Electron 会运行当前目录(.)下的 package.json 文件中 main 字段指定的文件。而运行该文件的进程既是主进程。运行在主进程中的脚本可以通过创建一个窗口,并传入 URL,让这个窗口加载一个网页来展示图形界面。与创建 GUI 相关的接口只应该由主进程来调用。
1 | import { ipcMain } from 'electron' |
渲染进程 (Renderer Process)
在Electron里的每个页面都有它自己的进程,叫作渲染进程。主进程通过实例化 BrowserWindow,每个 BrowserWindow 实例都在它自己的渲染进程内返回一个 web 页面。当 BrowserWindow 实例销毁时,相应的渲染进程也会终止。渲染进程由主进程进行管理。每个渲染进程都是相互独立的,它们只关心自己所运行的 web 页面。
1 | import { ipcRenderer as ipc } from 'electron'; |
注意事项
1.渲染进程中的事件名称可以自由定制,只需要在主进程进行相应事件名称的监听即可。
2.在主进程中只有一个ipcMain,但是在多窗口的情况下,ipcRenderer可能不止需要一个,这个时候如何区分是那个窗口发送的’close’事件呢?我想,只能通过给每个窗口关闭事件定义不同的名称来间接的区分主进程应该处理哪个窗口的事件。
1.Electron 进程通信
2.主进程VS渲染进程&不同页面间共享数据
3.Electron自定义最小化、最大化、关闭按钮
4.ipcRenderer
5.使用 Electron 在两个进程 (主进程和渲染进程) 之间进行通讯
6.关于透明无边框窗体window.isMaximized()始终返回false的解决方案
为了实现自定义的窗体放大和缩小按钮,一般是在渲染进程中使用ipcRenderer.send()发送一个事件,主进程监听事件,进行窗体放大和缩小。一般的代码是这样的写的:
1 | ipcMain.on('min', e=> mainWindow.minimize()); |
经过实验可以发现,在透明的无窗体的应用程序中,mainWindow.isMaximized()始终返回的是false,也就是说,mainWindow.unmaximize()这个代码是不执行的,bug反馈可以参考:github。解决方式是什么呢?主要思路是为btn-max按钮添加区分代码,最大化时添加icon-restore样式,程序判断,然后发送不同的消息给主进程,主进程通过判断传回的参数类型,进行放大或缩小。
1 | //渲染进程 |
7.安装ElementUI
使用Vue开发,当然少不了ElementUI了。安装方式很简单:npm i element-ui -S即可。
1 | import Vue from 'vue'; |
问题出在按需引用这里。按照官网的说法,安装:npm install babel-plugin-component -D,然后修改.babelrc文件,vue-cli3.0没有这个文件怎么办,我自己新建了一个.babelrc文件,然后将代码复制进去了,结果:
运行不起来的,只能换另外一种方式了,element提供了vue-cli3.0的插件,可以通过vue add element来安装这个插件,在安装插件之前,一定要保存自己的提交,一定要保存自己的提交,一定要保存自己的提交,vue插件会修改你的文件结构,只能add插件,还不能通过remove卸载插件,所以在安装任何插件之前都要谨慎操作。
安装倒是没什么问题,最后成功了:
继续运行yarn electron:serve,出问题了
仔细观察下,提示模块未找到,查看src/App.vue才知道,原来他把我的文件全部都改了,就为了显示一个button,使用 git diff src/App.vue 可以查看具体改了哪些东西。
再次印证了使用vue安装插件前一定要执行git add .和git commit -m “”,否则后果不堪设想。知道原因了,那怎么办呢,只能把文件再找回啊。使用命令:git checkout – src/App.vue可以放弃element对App.vue文件的修改,同时不影响其他的安装,这里也不用单独引入css文件了,如果需要添加其他的element组件,只需要在plugins/element.js文件中按照官网方式Vue.use()引用相应组件即可。
8.使用ElementUI滚动条组件
为了有个良好的用户体验,滚动条就不能使用浏览器自带的滚动条了,虽然用起来很方便。用什么滚动条呢?因为我用了elementui组件,所以我选择了使用elementui隐藏的组件el-scroll,不知道基于什么原因,官方文档中没有这个组件,但是可以直接使用。
1 | //按需引入 |
效果:
1.Vue的自定义滚动,我用el-scrollbar
9.ElementUI滚动条横向滚动条
使用el-scroll滚动条,会有一个奇怪的现象,就是横向滚动条还是默认的样式
解决方法
通过添加.el-scrollbar__wrap{overflow-x: hidden;}可以解决这个问题。
10.打包
使用 electron-forge 进行打包。
1 | ## 安装 |
【1】.打包您的应用程序
问题
(1)connect ETIMEDOUT 20.205.243.166:443
【尝试方案】
(1)在项目根目录新建 .npmrc,内容:
1 | electron_mirror=https://npmmirror.com/mirrors/electron/ |
【解决方案】
使用 pnpm config set 配置
1 | ## 设置缘 |
【1】.Electron RequestError: connect ETIMEDOUT 20.205.243.166:443 找国内镜像,比如npmmirror 中国镜像站:
【2】.Electron 安装失败:connect ETIMEDOUT 20.205.243.166:443 1.测试是否能ping通github.com,将ip配置到hosts文件中,保存。2.配置淘宝镜像。
【3】.yarn add electron 安装失败
【4】.pnpm安装electron依赖失败报错的解决方法