美文网首页
4.2 koa源码浅析

4.2 koa源码浅析

作者: 空无一码 | 来源:发表于2019-01-05 09:39 被阅读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如何实现的?
     listen(...args) {
        debug('listen');
        const server = http.createServer(this.callback());
        return server.listen(...args);
      }
    
    • app.use() 干了啥?
      use(fn) {
        ...省略了各种异常和兼容处理
        if (isGeneratorFunction(fn)) {
          fn = convert(fn); 
          // koa@2中间件只支持 async/await 封装的,如果要使用koa@1基于generator中间件,需要通过中间件koa-convert封装一下才能使用
        }
        this.middleware.push(fn);
        return this;
      }
    
    • callback 源码
      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()中请求、响应、上下文以及中间件的有关逻辑了。更深入的探究,就是基于此一步步分析各个模块的实现了。

    相关文章

      网友评论

          本文标题:4.2 koa源码浅析

          本文链接:https://www.haomeiwen.com/subject/psaqrqtx.html