使用electron和vue,以ipc通信的方式构建客户端版本的掘金首页
1. 使用electron-vue新建基于vue
的electron
环境,更多配置请访问源项目
npm i -g vue-cli
vue init simulatedgreg/electron-vue my-project
cd my-project
npm i
npm run dev
复制代码
2. 打通electron
主进程与渲染进程的通信
定义常量作为
channel
,也就是事件类型名称
const CLIENT_NORMAL_MSG = 'CLIENT_NORMAL_MSG' // 渲染进程发出消息类型
const CRAWLER_NORMAL_MSG = 'CRAWLER_NORMAL_MSG' // 主进程发出消息类型
复制代码
渲染进程
在渲染进程中,使用vue plugin
的形式,具体参见vue
官方文档插件
ipcRenderer
是eventEmitter的一个实例,在渲染进程中使用,你可以通过它来像主进程发送同步和异步消息,也可以通过它来接收来自主进程的消息
const { ipcRenderer } = require('electron')const ipcService = Object.create(null)const callbackCache = []ipcService.install = Vue => {Vue.prototype.$ipcRenderer = {send: (msgType, msgData) => {ipcRenderer.send(CLIENT_NORMAL_MSG, {type: msgType,data: msgData,})},on: (type, callback) => {callbackCache.push({type,callback,})}}ipcRenderer.on(CRAWLER_NORMAL_MSG, (sender, msg) => {callbackCache.forEach(cache => {if (cache.type === msg.type) {cache.callback && cache.callback(msg.data)}})}) // 监听主进程的消息}export default ipcService复制代码
在vue
项目中通过this.$ipcRenderer.on
的方式添加主进程发送消息的监听,通过this.$ipcRenderer.send
的方式向主进程发送消息,保证发出消息均为CLIENT_NORMAL_MSG
类型,收到消息均为CRAWLER_NORMAL_MSG
,通过消息中的二级固定参数type
来区分具体类型,并可以通过detach
的方式来取消特定的类型的消息的监听
最后在Vue
的入口文件,也就是渲染进程的入口文件使用上面定义的插件 Vue.use(ipcService)
渲染进程中的配置完成
主进程
使用class
的方式来定义,需要传入两个参数来实例化这个class
,需要传入两个参数,listener
为监听消息者,sender
为发送消息者
ipcMsgHandler
中包含了所有的handler
,为其传入this
以便能够在其中向渲染进程发送消息
import ipcMsgHandler from './ipcMsgHandler'export default class Ipc {constructor(listener, sender) {this.listener = listenerthis.sender = senderthis.addListener(CLIENT_NORMAL_MSG, this.handleFn.bind(this))this.handlerList = ipcMsgHandler(this)}handleFn(event, data) {try {this.handlerList[data.type](event, data.data)} catch (error) {console.error('handler event error:' + error.message)}}addListener(chanel, cb) {this.listener.on(chanel, cb)}_sendMsg(chanel, msgBody) {this.sender.send(chanel, msgBody)}sendToClient(type, data) {this._sendMsg(CRAWLER_NORMAL_MSG, {type,data,})}}
复制代码
初始状态下ipcMsgHandler.js
文件
export default _ipc => ({})
复制代码
在主进程的入口文件(/src/main/index.js
)中对Ipc
这个class
实例化,其中需要使用的listener
为ipcMain
,ipcMain
和ipcRenderer
不同,它只负责对消息的监听,不复杂发送消息,这里需要入口文件中的mainWindow
下的webContents
作为消息的发送者,所以需要在mainWindow
创建成功之后再进行Ipc
的实例化
// ...
function createWindow() {mainWindow = new BrowserWindow({// ...});new IpcMgr(ipcMain, mainWindow.webContents)
}
复制代码
3. 完成具体功能开发
引入element-ui
,使用babel
配置css
按需加载,具体配置方式element-ui官网
分析掘金首页数据来源
掘金首页七种分类下数据均来自一个接口,https://timeline-merger-ms.juejin.im/v1/get_entry_by_rank?src=web&limit=20&category=xxx
,通过category
进行分类的区分
渲染进程开发
在App.js
中,在进入页面和切换分类时向主进程发送消息
// ...methods: {startRequest() {this.$ipcRenderer.send('start-request', this.activeCategory)},onRequestBack() {this.$ipcRenderer.on('request-back', data => {// todo...})},}
复制代码
主进程开发
现在渲染进程中已经定义了两种消息类型start-request
和request-back
,start-request
告诉主进程开始执行任务,完成后request-back
告诉渲染进程任务完成,渲染进程收到消息后通过收到的数据来对页面进行操作。
在ipcMsgHandler.js
中进行拓展,使用axios
对接口内容进行抓取
import axios from 'axios'const handlerList = _ipc => ({['start-request'](event, category) {const requestBack = data => {_ipc.sendToClient('request-back', data)}axios.get(`https://timeline-merger-ms.juejin.im/v1/get_entry_by_rank?src=web&limit=20&category=${category}`).then(r => {if(r.status === 200) {requestBack({success: true,rows: r.data.d.entrylist})} else {requestBack({success: false,error: `server error code: ${r.status}`})}}).catch(e => requestBack({success: false,error: `server error code: ${e.status} msg: ${e.message}`}))}})
复制代码
请求完成后,通过requestBack
向渲染进程发送消息,渲染页面,操作样式调整,页面看起来大概是这样。
4. 增加链接跳转到默认浏览器
在该项目中如果直接使用window.open
的方式来打开的话,它会新弹出一个electron
窗口,所有连接跳转也需要用到ipc
的方式
在electron
中,有一个shell
对象,它提供一个openExternal
的方法来在默认浏览器中打开链接
在ipcMsgHandler.js
中新增以下内容
const { shell } = require('electron')export default _ipc => ({['open-shell'](event, url) {shell.openExternal(url)},// ...})
复制代码
现在就可以在vue
中通过this.$ipcRenderer.send('open-shell', url)
的方式来在默认浏览器中打开链接了
一个通过打通IPC
通信方式的掘金首页概览客户端就完成了,通过npm run build
就可以对这个应用进行打包了
PS: 其实在electron
中是可以支持跨域访问的,只需要在创建窗口的时候加上一下配置项就行了,不过结果其实并不重要,重要的是过程了
webPreferences: {webSecurity: false,
}
复制代码
以上代码都可以在github上找到,欢迎star~~~
使用electron和vue,以ipc通信的方式构建客户端版本的掘金首页相关推荐
- vue组件间通信六种方式
vue组件间通信六种方式 组件之间的传值通信 组件之间的通讯分为三种:父传子.子传父.兄弟之间的通讯: props/$emit 父传子:主要是通过props来实现的 具体实现:父组件通过import引 ...
- vue组件间通信六种方式(完整版)
前言 组件是 vue.js 最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系: 如上图所示 ...
- 微软不会放弃Electron:Electron 快速入门及IPC 通信
最近,有媒体推文说"微软要放弃Electron了",很多不明真相的群众被带偏了节奏:我刚学了Electron就要过时了吗?求真相!那么我们还要不要学Electron呢? 实际上:只 ...
- Vue 组件间通信六种方式
前言 组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系: 如上图所示,A 和 B.B 和 C.B 和 D ...
- web前端培训分享Electron之IPC 通信
本文由小千给大家分享Electron之IPC 通信. 1.index.html <!DOCTYPE html><html><head><meta charse ...
- web前端技术分享Electron之IPC 通信
本文由小千给大家分享Electron之IPC 通信. 1.index.html <!DOCTYPE html><html><head><meta charse ...
- async function_Electron IPC 通信如何使用 async/await 调用?
前言碎语 此想法是在使用 electron 进程间通信(IPC)过程中,无法忍受其 API 的使用不友好性而产生. 为了提高代码可读性.可维护性,而不得已造轮子了. 生命在于折腾,其乐无穷. Elec ...
- Today:基于 Electron 和 Vue.js 的 GTD 应用
这是我的一个 side project.今天发布了第一个预览版本 v0.0.2,欢迎访问 GitHub 上面的 Repo 获取试用下载(目前仅为 Mac 用户提供 build),并提供你们的宝贵意见和 ...
- 传统的Linux中IPC通信原理
在了解 Binder 跨进程通信原理之前, 我们先了解一下 Linux 传统的进程间通信的概念和基本原理, 这样有助于我们更好的理解 Binder 的通信原理. 这个部分基本都是理论, 基础不是很好的 ...
最新文章
- docker 查看虚拟网卡_最简单的免费虚拟化方案:Hyper-V Server + Windows Admin Center
- Linus:“我删除了Linux,因为它就是个垃圾!”
- oracle 查询spid,查看数据库session的sid来查杀对应系统进程号spid
- 解决eclipse中git插件中的cannot open git-upload-pack问题
- Android相对布局(RelativeLayout)常用属性、练习使用按键、文本框等控件、线性布局(LinearLayout)属性
- 相约11月25日,开发者的嘉年华
- C++ STL list输出和增加
- web 三联发票针式打印_不要买二手激光打印机,公开咸鱼卖家套路
- exc_bad_instruction(code=EXC_I386_INVOP,subcode=0x0) 错误
- python socket epoll
- python_海龟绘图_画出奥运五环图---python工作笔记014
- 【T-SQL基础】02.联接查询
- 程序员面试谈薪的背后的事,你一定要看看
- Java调优案例分析与实战
- android arcgis缓存,ArcGis for android 加载tpk离线文件
- 牛逼哄哄的京东 JD-hotkey !
- VS2017安装WTL,解决创建WTL项目一直回弹问题
- 怎样将系统防御升到服务器级别,H3C IPS入侵防御系统 Web配置手册-5PW104
- 17 RFID卡的读写
- pytorch训练GAN的代码(基于MNIST数据集)
热门文章
- POJ3246-Balanced Lineup,好经典的题,做法和HDU-I hate it 一样~~
- (转)服务器控件三个ID
- 防止 重复重建相同的表
- SAC 智能版面分析技术(structure Analysis Core )
- 大数据之-Hadoop3.x_MapReduce_Job提交流程---大数据之hadoop3.x工作笔记0103
- AndroidStudio_Android使用OkHttp发起Http请求_以及使用时需要注意的点---Android原生开发工作笔记220
- uview中使用_使用uniapp自带的地图_实现地图点选位置功能---基于Vue的uniapp手机端_前端UI_uview工作笔记006
- Elasticsearch--Docker安装kibana---全文检索引擎ElasticSearch工作笔记003
- PostGreSql学习笔记001---PostgreSQL10.4安装(Windows)_支持PostGreGis_PostJDBC
- CString、char*之间的相互转换