玩转玩转Koa之核心原理分析之核心原理分析
koa作为下一代Web开发框架,不仅让我们体验到了async/await语法带来同步方式书写异步代码的酸爽,而且本身简洁的特
点,更加利于开发者结合业务本身进行扩展。
本文从以下几个方面解读Koa源码:
1.封装创建应用程序函数
2.扩展res和req
3.中间件实现原理
4.异常处理
一、封装创建应用程序函数
利用NodeJS可以很容易编写一个简单的应用程序:
注意:当浏览器发送请求时,会附带请求/favicon.ico。
而Koa在封装创建应用程序的方法中主要执行了以下流程:
1.组织中间件(监听请求之前)
2.生成context上下文对象
3.执行中间件
4.执行默认响应方法或者异常处理方法
二、扩展res和req
首先我们要知道NodeJS中的res和req是http.IncomingMessage和http.ServerResponse的实例,那么就可以在NodeJS中这样
扩展req和res:
而Koa中则是自定义request和response对象,然后保持对res和req的引用,最后通过getter和setter方法实现扩展。
所以在Koa中要区别这两组对象:
request、response: Koa扩展的对象
res、req: NodeJS原生对象
此时已经可以采用这样的方式访问header属性:
但是为了方便开发者调用这些属性和方法,Koa将response和request中的属性和方法代理到context上。
通过Object.defineProperty可以轻松的实现属性的代理:
而对于方法的代理,则需要注意this的指向:
上述就是属性代理和方法代理的核心代码,这基本算是一个常用的套路。
代理这部分详细的源码,可以查看node-delegates , 不过这个包时间久远,有一些老方法已经废除。
在上述过程的源码中涉及到很多JavaScript的基础知识,例如:原型继承、this的指向。对于基础薄弱的同学,还需要先弄懂
这些基础知识。
三、中间件实现原理
首先需要明确是:中间件并不是NodeJS中的概念,它只是connect、express和koa框架衍生的概念。
1、connect中间件的设计
在connect中,开发者可以通过use方法注册中间件:
use方法内部获取到中间件的路由信息(默认为'/')和中间件的处理函数之后,构建成layer对象,然后将其存储在一个队列当
中,也就是上述代码中的stack。
connect中间件的执行流程主要由handle与call函数决定:
handle函数中使用闭包函数next来检测layer是否与当前路由相匹配,匹配则执行该layer上的中间件函数,否则继续检查下一
评论0
最新资源