4.2 koa源码浅析

2019-01-05  本文已影响7人  空无一码

本节将带着大家简单看一下koa2.x最新版本的源码。

源码结构

在上一章我们已经分享了查看依赖库源码的方法,本节我们还是基于方式一,直接到项目下de node_modules目录下找到koa。包含了如下文件:

├── History.md // 历史版本管理
├── LICENSE // 开源协议
├── Readme.md // 依赖库的有关介绍
├── lib
│   ├── application.js //入口文件,封装了context,request,response,以及最核心的中间件处理流程。
│   ├── context.js //处理应用上下文,里面直接封装部分request.js和response.js的方法
│   ├── request.js // 处理http请求
│   └── response.js // 处理http响应
└── package.json // 模块管理

我们看到源码都在lib目录下, koa2.x作为一个web框架,只提供了封装好的HTTP服务,以及基于async/await的中间件容器。用Koa.js想实现大部分Web功能的话,就需要通过中间件来实现,如我们前面用到的koa-static。

一些常用方法的实现

 listen(...args) {
    debug('listen');
    const server = http.createServer(this.callback());
    return server.listen(...args);
  }
  use(fn) {
    ...省略了各种异常和兼容处理
    if (isGeneratorFunction(fn)) {
      fn = convert(fn); 
      // koa@2中间件只支持 async/await 封装的,如果要使用koa@1基于generator中间件,需要通过中间件koa-convert封装一下才能使用
    }
    this.middleware.push(fn);
    return this;
  }
  callback() {
    const fn = compose(this.middleware);
    if (!this.listenerCount('error')) this.on('error', this.onerror);
    const handleRequest = (req, res) => {
      const ctx = this.createContext(req, res);
      return this.handleRequest(ctx, fn);
    };
    return handleRequest;
  }

可以看到,在我们实例化 const app = new koa(); 后,执行 app.use() 系列中间件后,会把各中间件添加进 middleware 这个数组,然后再执行app.listen() 的时候,会把callback()回调函数传入 node原生的http模块的createServer()方法,然后在启动服务器以后就会执行callback()中请求、响应、上下文以及中间件的有关逻辑了。更深入的探究,就是基于此一步步分析各个模块的实现了。

上一篇下一篇

猜你喜欢

热点阅读