手撕koa,从零掌握koa的实现原理(1)

659 阅读2分钟

「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」。

手撕koa,从零掌握koa的实现原理。

前言

最近在学习node,借着更文活动,和大家分享一下,希望大家指出不足。

了解官方koa的目录

  • 图一是npm安装的官方koa的结构。koa就是对node原生的http服务进行了封装。各个文件的具体作用如下。

    • koa/lib/application.js中是koa的整个应用。

    • koa/lib/context.js中是koa的上下文。

    • koa/lib/request.js是用于扩展原生请求的。

    • koa/lib/response.js是用于扩展原生响应的。

    • koa/dist/koa.mjs用来处理esModule的。

      2022-01-18-2.png

      (图一node_modules/koa的目录结构)

  • 我们使用koa的时候是下面这样。

    const Koa = require('koa')
    const app = new Koa()
    
  • 不知道大家有没有这个疑问,那我们导入的这个koa是从哪里来的呢?

    从图二可以看到,在koapackage.jsonmain的值是lib/application.js,在我们导入第三方npm包的时候,require会优先导入package.jsonmain指定的文件。

    2022-01-18-3.png

    (图二node_modules/koa/package.json

我们自己的koa工程目录

整个工程叫koakoa/koa文件夹存放我们自己实现的koa代码,src文件夹存放我们的测试代码。

2022-01-18-1.png

(图三项目工程结构)

application.js初步实现

在我们工程目录koa/koa/lib下新建一个application.jsapplication.js的里边主要是导出我们的整个koa。回想我们使用koa的时候,koa是一个类,需要用new去调用。

  • koa/koa/lib/application.js

    class Application {
      constructor(){
        console.log('我是Application')
      }
    }
    
    module.exports = Application
    

    我们声明一个Application的类,在constructor中输出我是Application,最后导出Application

  • koa/src/server.js

    koa/src/server.js中我们导入Application类,我们可以在koa/koa文件夹下面新建一个package.json,里面加入main字段,这样我们在导入我们自己的koa的时候就会自动去找main指定的文件了。

    • koa/koa/package.json
      {
        "main": "./lib/application.js"
      }
      

导入Application,测试一下

src目录下新建一个server.js,我们来写我们的测试代码。

  • koa/src/server.js

    const Koa = require('../koa')
    const app = new Koa()
    

    这里require('../koa')会导入koa/koa/package.jsonmain指定的文件,我们用node跑一下koa/src/server.js,控制台成功打印见图四。

    2022-01-18-4.png

    (图四控制台打印)

今天的实现就到这里,明天继续。

看到这里的兄弟给点个赞吧,万分感谢。

最近也在学习如何搭建自己的博客,博客地址:Roubzi Blog ,目前还在搭建中,希望和大家多交流。

在这个不能停下脚步的时代,即便我们很菜,我们也可以去追求更优秀的自己,以及,所有那些值得去追求的美好事物。

时不我待,舍我其谁。

新的一年,祝你,也祝我。