koa2源码解读与总结

koa2的源码比较简单,整个框架只要可以很好的理解其中间件基本就能了解其运行和设计的原理。node

我建议读koa的源码最好从使用的写法开始梳理,一步一步深刻其原理。设计模式

一段最简单的koa源码以下:

const Koa = require('koa');
const app = new Koa();

app.use(async ctx => {
  ctx.body = 'Hello World';
});

app.listen(3000);复制代码

根据此段代码能够看出,koa是一个对象,从案例上看此对象上有use、listen方法。让咱们来看看它是如何工做的。数组

listen方法如何工做

来到 lib/application.js 文件,先看listen方法。缓存


代码很简单,建立一个http服务,而后监听3000端口,这样就建立了一个简单的http服务。bash


this.callback() 返回一个 有req和res参数的函数。至此listen方法就已经明了。cookie

listen(...args) {
    const server = http.createServer((req, res) => {
      const ctx = this.createContext(req, res);

      return this.handleRequest(ctx, fn);
    });
    return server.listen(...args);
  }复制代码

跟node.js建立一个http服务是一致的。app

koa中间件如何工做

中间件事koa.js的核心概念和核心组成部分,其强大,可拓展也是在于此。框架


use方法很简单,向koa对象的 middleware中push函数。接下来看看中间件函数如何工做。koa

app.use -> app.middleware -> koa-compose -> http.createServer复制代码

全部的中间件函数都会缓存到app.middlewares数组中,建立http.createServer时默认拿到第一个中间件函数去进行相应的操做,koa-compose是处理中间件的核心。async


根据源代码能够看出 koa-compose 会首先执行一次 dispatch(0) 也就是默认返回第一个 app.use传入的函数 使用Promise函数封装返回,其中第一个参数是咱们经常使用的ctx,第二个参数就是next参数,

next 每次执行以后都会等于下一个中间件函数,若是下一个中间件函数不为真则返回一个成功的Promise。所以咱们每次调用next()就是在执行下一个中间件函数。

错误处理

koa对错误进行了统一的处理




其余文件说明

  • lib/context.js 主要是对 context/ctx的封装,拓展了不少方法
  • lib/request.js 对ctx.req 的封装,拓展了不少方法
  • lib/response.js 对ctx.res 的封装,拓展了不少方法

这些方法在官网都有很详细的介绍。

此源码解析并无真正的一字一行的去解析,去理解,只讲解了面。


总结:

  • koa是一个很轻量级的node.js基础框架,性能优,入门简单
  • 核心的设计模式是对中间件的设计,框架只提供了基础的功能,比例cookie,router等都是由中间件去完成,可扩展性很是强
  • 广大贡献者提供了N多的中间件,是一个很健全的基础框架
  • 中间间使用灵活,因为其使用机制,中间件会有顺序的问题,使用者需注意,有些中间件须要提早引入,有些中间件须要后面引入
  • 开发模式灵活,没有任何的代码性和规范性的约束,所以能够作为任何node.js框架的底层库,同时也因为此缘由若是涉及到多人协做,开发者须要注意到规范性的约束
  • 适合我的开发者,官网开发等,不太适合大型项目的多人协做项目,若是有很好的上层封装,或者二次开发就更能适应企业级的node.js开发,好比egg.js,thinkjs
  • 因为koa很轻量,所以不少功能不健全须要开发者有必定的能力去完善它,例如统一的错误上报及其监控,集群处理,单元测试等功能
相关文章
相关标签/搜索