解析nodeJS模块源码 亲手打造基于ES6的观察者系统

发布时间:2019-08-13 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了解析nodeJS模块源码 亲手打造基于ES6的观察者系统脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

毫无疑问,nodeJS改变了整个前端开发生态。本文通过分析nodeJS当中events模块码,由浅入深,动手实现了属于自己的ES6事件观察者系统。千万不要被nodeJS的外表吓到,不管你是写nodeJS已经轻车熟路的老司机,还是初入前端的小菜鸟,都不妨碍对这篇文章的阅读和理解。

@H_777_3@事件驱动设计理念

nodeJS官方介绍中,第二句话便是:

"Node.js uses an event-driven, non-blocking I/O model that makes IT lightweight and efficient"。

由此,“事件驱动(event-driven)”理念对nodeJS设计的重要性可见一斑。比如,我们对于文件的读取,任务队列的执行等,都需要这样一个观察者模式来保障。

那个最熟悉的陌生人

同时,作为前端开发人员,我们对于所谓的“事件驱动”理念——即“事件发布订阅模式(Pub/Sub模式)”一定再熟悉不过了。这种模式在js里面有与生俱来的基因。我们可以认为JS本身就是事件驱动型语言:
比如,页面上有一个button, 点击一下就会触发上面的click事件。这是因为此时有特定程序正在监听这个事件,随之触发了相关的处理程序。

这个模式最大的一个好处在于能够解耦,实现“高内聚、低耦合”的理念。那么这样一个“熟悉的”模式应该怎么实现呢?

其实社区上已经有不少前辈的实现了,但是都不能算特别完美,或者不能完全符合特定的场景需求。

本文通过解析nodeJS源码中的events模块,提取其精华,一步步打造了一个基于ES6的eventEmitter系统。

读者有任何想法,欢迎与我交流。同时希望各路大神给予斧正。

背景简介

为了方便大家理解,我从一个很简单的页面实例说起。

百度某产品页面中,存在两处不同的收藏组件:

  • 一处在页面顶部;

  • 一处在页面详情侧栏。

第一次点击一个收藏组件按钮,发送异步请求,进行收藏,同时请求成功的回调函数里,需要将页面中所有“收藏”按钮转换状态为“已收藏”。以达到“当前文章”收藏状态的全局同步。

解析nodeJS模块源码 亲手打造基于ES6的观察者系统

完成这样的设计很简单,我们大可在业务代码中进行混乱的操作处理,比如初学者常见的做法是:点击第一处收藏,异步请求之后的回调逻辑里,修改页面当中所有收藏按钮状态。

这样做的问题在于耦合混乱,不仅仅是一个收藏组件,试想当代码中所有组件全都是这样的“随意”操作,后期维护成本便一发不可收。

我的Github仓库中,也有对于这么一个页面实例的分析,读者若想自己玩一下,可以访问这里。

当然,更优雅的做法就是使用事件订阅发布系统。
我们先来看看nodeJS是怎么做的吧!

nodeJS方案

读者可以自己去nodeJS仓库查找源码,不过更推荐参考我的Github-事件发布订阅研究项目,里面不仅有自己实现的多套基于ES6的事件发布订阅系统,也“附赠”了nodeJS实现源码。同时我对源码加上了汉语注释,方便大家理解。

在nodeJS中,引入eventEmitter的方式和实例化方法如下: