Koa源码解读

729 阅读3分钟

前言

koa2现在是比较火的一个node框架,而且它很轻量级。其源码也是非常的简洁漂亮。今天就好好读一读它的源码,深入探讨一下koa2相比原生的node到底做了什么🐂🍺的事。

什么是koa

Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。

上面是koa官网的原话,其中有几个关键字很惹眼。

  1. async:koa是通过async和await来完成异步操作(这里只讨论koa2)
  2. 中间件:koa的一大特色,相当于是一个函数栈(FILO)
  3. 一套优雅的方法:其实就是对node的http请求做一个封装

源码

话不多说,直接进入源码吧。

代码接口

image.png

没错,koa的源码就是这4个文件。(确实好轻)当然,还会有一些依赖,比如koa-compose等等

application.js

这个文件就是koa的入口文件,里面里面exports了一个类(Application),new koa()的时候,实际上就是new了一个这个类(Application)的实例。

具体看一下这个类做了什么:

构造函数:

image.png

有3个比较重要的对象:contextrequestresponse。后面会讲。

use函数:

image.png

用的是push函数,把中间件推入数组,这里可以看出中间件的执行顺序;先进入先执行(后面会继续深入探讨)

listen函数:

image.png

callback函数 和 handleRequest函数:

image.png

callbalk:这里把中间件数组传入compose函数,然后得到一个函数fn。定义一个内部的handleRequest函数,并返回该函数。

handleRequest函数:上面的定义的内部函数中,调用该函数。执行传入的中间件函数,并处理起成功和失败的回调。

compose函数:(该函数在kao-compose包里面)

image.png

把中间件是䟔传入compose函数,返回一个聚合函数。

createContext函数:

image.png

OK,application.js的主要函数(基本上是全部函数了😂)介绍完了。

context.js生成上下文对象的函数

image.png

其构造函数,只是提供了几个工具方法,有兴趣的自行翻阅源码

image.png

重点的是: 这行了两个delegate方法,该方法就是把目标对象的响应属性代理到源对象上 例如:把response对象上的attachment方法代理到proto对象上

源码地址,原来是tj大神写的

request.js 和 response.js

这两个比较简单:通过get和set控制获取和设置req或者res对象的属性,例如下面两个图

image.png

image.png

总结

koa的实现原理:

  1. 通过application.js中提供的工具方法:uselisent进行中间件注册和启动node原生http服务
  2. 利用koa-compose中的compose函数,对中间件数组做聚合操作,最终得到一个函数
  3. 通过context.js函数,得到ctx上下文对象,并把请求中的requestresponse的属性代理到ctx
  4. 通过request.jsresponse.js文件,利用getset控制req或者res对象的属性获取和属性设置

注意:compose中使用的是Promise实现的中间件聚合,所以外面的才可以使用 async/await的语法