1. 使用electron-vue新建基于vueelectron环境,更多配置请访问源项目

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实例化,其中需要使用的listeneripcMainipcMainipcRenderer不同,它只负责对消息的监听,不复杂发送消息,这里需要入口文件中的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-requestrequest-backstart-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通信的方式构建客户端版本的掘金首页相关推荐

  1. vue组件间通信六种方式

    vue组件间通信六种方式 组件之间的传值通信 组件之间的通讯分为三种:父传子.子传父.兄弟之间的通讯: props/$emit 父传子:主要是通过props来实现的 具体实现:父组件通过import引 ...

  2. vue组件间通信六种方式(完整版)

    前言   组件是 vue.js 最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系:                如上图所示 ...

  3. 微软不会放弃Electron:Electron 快速入门及IPC 通信

    最近,有媒体推文说"微软要放弃Electron了",很多不明真相的群众被带偏了节奏:我刚学了Electron就要过时了吗?求真相!那么我们还要不要学Electron呢? 实际上:只 ...

  4. Vue 组件间通信六种方式

    前言 组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系: 如上图所示,A 和 B.B 和 C.B 和 D ...

  5. web前端培训分享Electron之IPC 通信

    本文由小千给大家分享Electron之IPC 通信. 1.index.html <!DOCTYPE html><html><head><meta charse ...

  6. web前端技术分享Electron之IPC 通信

    本文由小千给大家分享Electron之IPC 通信. 1.index.html <!DOCTYPE html><html><head><meta charse ...

  7. async function_Electron IPC 通信如何使用 async/await 调用?

    前言碎语 此想法是在使用 electron 进程间通信(IPC)过程中,无法忍受其 API 的使用不友好性而产生. 为了提高代码可读性.可维护性,而不得已造轮子了. 生命在于折腾,其乐无穷. Elec ...

  8. Today:基于 Electron 和 Vue.js 的 GTD 应用

    这是我的一个 side project.今天发布了第一个预览版本 v0.0.2,欢迎访问 GitHub 上面的 Repo 获取试用下载(目前仅为 Mac 用户提供 build),并提供你们的宝贵意见和 ...

  9. 传统的Linux中IPC通信原理

    在了解 Binder 跨进程通信原理之前, 我们先了解一下 Linux 传统的进程间通信的概念和基本原理, 这样有助于我们更好的理解 Binder 的通信原理. 这个部分基本都是理论, 基础不是很好的 ...

最新文章

  1. docker 查看虚拟网卡_最简单的免费虚拟化方案:Hyper-V Server + Windows Admin Center
  2. Linus:“我删除了Linux,因为它就是个垃圾!”
  3. oracle 查询spid,查看数据库session的sid来查杀对应系统进程号spid
  4. 解决eclipse中git插件中的cannot open git-upload-pack问题
  5. Android相对布局(RelativeLayout)常用属性、练习使用按键、文本框等控件、线性布局(LinearLayout)属性
  6. 相约11月25日,开发者的嘉年华
  7. C++ STL list输出和增加
  8. web 三联发票针式打印_不要买二手激光打印机,公开咸鱼卖家套路
  9. exc_bad_instruction(code=EXC_I386_INVOP,subcode=0x0) 错误
  10. python socket epoll
  11. python_海龟绘图_画出奥运五环图---python工作笔记014
  12. 【T-SQL基础】02.联接查询
  13. 程序员面试谈薪的背后的事,你一定要看看
  14. Java调优案例分析与实战
  15. android arcgis缓存,ArcGis for android 加载tpk离线文件
  16. 牛逼哄哄的京东 JD-hotkey !
  17. VS2017安装WTL,解决创建WTL项目一直回弹问题
  18. 怎样将系统防御升到服务器级别,H3C IPS入侵防御系统 Web配置手册-5PW104
  19. 17 RFID卡的读写
  20. pytorch训练GAN的代码(基于MNIST数据集)

热门文章

  1. POJ3246-Balanced Lineup,好经典的题,做法和HDU-I hate it 一样~~
  2. (转)服务器控件三个ID
  3. 防止 重复重建相同的表
  4. SAC 智能版面分析技术(structure Analysis Core )
  5. 大数据之-Hadoop3.x_MapReduce_Job提交流程---大数据之hadoop3.x工作笔记0103
  6. AndroidStudio_Android使用OkHttp发起Http请求_以及使用时需要注意的点---Android原生开发工作笔记220
  7. uview中使用_使用uniapp自带的地图_实现地图点选位置功能---基于Vue的uniapp手机端_前端UI_uview工作笔记006
  8. Elasticsearch--Docker安装kibana---全文检索引擎ElasticSearch工作笔记003
  9. PostGreSql学习笔记001---PostgreSQL10.4安装(Windows)_支持PostGreGis_PostJDBC
  10. CString、char*之间的相互转换