学习体会
要想看源码首先需要明白几点
1、为什么这个东西要出来、有什么作用和好处
2、这个东西怎么用
3、接下来才到他的原理解读
真希望在重复这个过程的时候会得到启发,从而做出真正属于自己的东西。
1、koa为什么会出来
一、如果直接使用node来进行服务端处理会显得非常麻烦、所以才有了express和koa等框架。所谓的框架无非就是对原有的api进行了进一步的封装,使得功能更加好用和完善。其次,在设计的时候还需要保证框架可以很好的扩展生态,也就是可以附加额外的功能,在koa中体现就是中间件。
二、koa相比express更加轻量,几乎所有的额外功能都需要中间件来扩展、需要什么引入什么就好了,所以体积更小。
2、koa原理
koa其实很简单、主要做了两件事情,1、将res和req封装到ctx中,2、实现中间件。
在源码中共有四个文件,application、context、request和response。application是主文件、暴露koa类。
1、ctx的实现
一、ctx的实现
koa实现了两个类扩充了原生req和res,request和response。
拿一个 取请求头数据的简单例子
首先通过application中的createContext方法将req和res方法挂载到request和response上
createContext(req, res) {
const context = Object.create(this.context) //对于每次请求 都要保证ctx相互独立 以下类似
const request = context.request = Object.create(this.request)
const response = context.response = Object.create(this.response)
context.app = request.app = response.app = this
context.req = request.req = response.req = req //挂载req
context.res = request.res = response.res = res//挂载res
request.ctx = response.ctx = context
request.response = response
response.request = request
context.originalUrl = request.originalUrl = req.url
context.state = {
}
return context
}
随后通过挂载在上面的req对其进行封装,从req.headers=>request.headers
问题?为什么要创建一个request,而不直接加在ctx上呢?
我认为主要原因是降低代码的耦合性,从而可以更好的维护。
module.exports = {
get header() {
return this.req.headers
},
set header(val) {
this.req.headers = val
}