express源码剖析1

Posted anthonyliu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了express源码剖析1相关的知识,希望对你有一定的参考价值。

在通读源码之前,先把一些比较难理解的代码吃透:

1.EventEmitter.prototype

mixin(app, EventEmitter.prototype, false);

app为一个函数,也是对象。

mixin是一个类库(merge-descriptors)它就是一种mixin设计模式,作用是让app这个对象具有EventEmitter.prototype的方法。

第三个参数表示“是否重新定义app中与EventEmitter.prototype中存在重名的方法。

2.EventEmitter类

EventEmitter是nodejs中event的一个类,也是唯一类。它的核心就是事件触发与事件监听功能的封装。

3.EventEmitter实例的产生

Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStream对象会在文件被打开的时候发出一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。   

4.EventEmitter类的静态方法

4.1 newListener事件

   当注册一个事件时,触发newListener事件,例如:

const myEmitter = new MyEmitter();
// Only do this once so we don‘t loop forever
//定义触发newListener事件的函数
myEmitter.once(‘newListener‘, (event, listener) => { if (event === ‘event‘) { // Insert a new listener in front myEmitter.on(‘event‘, () => { console.log(‘B‘); }); } }); myEmitter.on(‘event‘, () => { console.log(‘A‘); }); myEmitter.emit(‘event‘); //B //A

4.2 removeListener事件

 对应newListener事件,当监听器被移除时,‘removeListener‘ 事件被触发。

5.EventEmitter类的静态成员

5.1EventEmitter.defaultMaxListeners

  唯一的静态成员,默认值是10,表示对应监听同一的事件个数是10个,不建议修改这个参数,否则会影响到所有EventEmitter实例的。

6.EventEmitter的prototype对象

var MyEmitter = require(‘events‘);
console.log(MyEmitter.prototype); 

结果是:

EventEmitter {
  domain: undefined,
  _events: undefined,          
  _maxListeners: undefined,
  setMaxListeners: [Function: setMaxListeners],
  getMaxListeners: [Function: getMaxListeners],
  emit: [Function: emit],
  addListener: [Function: addListener],
  on: [Function: addListener],
  once: [Function: once],
  removeListener: [Function: removeListener],
  removeAllListeners: [Function: removeAllListeners],
  listeners: [Function: listeners],
  listenerCount: [Function: listenerCount] }
[Finished in 0.3s]

 

回到1,就表示app对象(函数)它具有以上方法,即app继承了EventEmitter的原型对象

 

以上是关于express源码剖析1的主要内容,如果未能解决你的问题,请参考以下文章

express源码剖析

《Docker 源码分析》全球首发啦!

Mybatis源码剖析:传统开发方式源码剖析

Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段

SurfaceView源码以及崩溃剖析

libevent网络编程汇总