如何从零开始手写Koa2框架

  

  
      <李>高雅——基于节点。js平台的下一代web开发框架李   <李>亚是一个新网络的框架,由表达幕后的原班人马打造,致力于成为web应用API和开发领域中的一个更小,更富有表现力,更健壮的基石。   <李>与其对应的表达来比,高雅更加小巧,精壮,本文将带大家从零开始实现高雅的源码,从根源上解决大家对高雅的困惑李   
  
本文高雅版本为2.7.0,版本不一样源码可能会有变动   

  

亚源码目录截图
  

  

如何从零开始手写Koa2框架

  

通过源码目录可以知道,高雅主要分为4个部分,分别是:

  
      <李>应用程序:高雅最主要的模块,对应的应用应用对象李   <李>背景:对应ctx对象李   <李>要求:对应高雅中请求对象李   <李>回应:对应高雅中响应对象李   
  

这4个文件就是高雅的全部内容了,其中应用又是其中最核心的文件。我们将会从此文件入手,一步步实现高雅框架

  

  

我的应用程序         const {createServer}=要求(“http”);      模块。出口={类应用程序   构造函数(){//初始化中间件数组,所有中间件函数都会添加到当前数组中   这一点。中间件=[];   }//使用中间件方法   使用(fn) {//将所有中间件函数添加到中间件数组中   this.middleware.push (fn);   }//监听端口号方法   听(args) {//使用nodejs的http模块监听端口号   res=createServer (const服务器(点播)=比;{/*   处理请求的回调函数,在这里执行了所有中间件函数   要求的是节点原生的请求对象   res是节点原生的反应对象   */this.middleware.forEach ((fn)=比;fn(点播,res));   })   server.listen (…args);   }   }      

index.js      //引入自定义模块   const MyKoa=要求(“。/js/我的应用程序”);//创建实例对象   const应用=new MyKoa ();//使用中间件   res app.use(点播)=比;{   console.log(“中间件函数执行了~ ~ ~ 111 ');   })   res app.use(点播)=比;{   console.log(“中间件函数执行了~ ~ ~ 222 ');   res.end(“你好myKoa”);   })//监听端口号   app.listen(3000年,呃=比;{   如果(!犯错)console.log(“服务器启动成功了”);   其他console.log(错);   })      

运行入口文件<代码>索引。js代码后,通过浏览器输入网址访问<代码> http://localhost: 3000/>   

神奇吧!一个最简单的服务器模型就搭建完了。当然我们这个极简服务器还存在很多问题,接下来让我们一一解决

  

  

提取<代码> createServer> <代码>方法(可复用)

     //监听端口号方法   听(args) {//使用nodejs的http模块监听端口号   const服务器=createServer (this.callback ());   server.listen (…args);   }   回调(){   const handleRequest=(点播,res)=比;{   this.middleware.forEach ((fn)=比;fn(点播,res));   }   返回handleRequest;   }      

封装<代码>编写代码> 方法

     //负责执行中间件函数的函数   函数组成(中间件){//合成方法返回值是一个函数,这个函数返回值是一个承诺对象//当前函数就是调度   返回(点播,res)=比;{//默认调用一次,为了执行第一个中间件函数   返回调度(0);   函数调度(我){//提取中间件数组的函数fn   让fn=中间件(我);//如果最后一个中间件也调用了一方法,直接返回一个成功状态的承诺对象   如果(fn)返回Promise.resolve ();/*   调度。bind (null, i + 1)作为中间件函数调用的第三个参数,其实就是对应的   举个栗子:如果我=0那么调度。bind (null, 1))   ——比;也就是如果调用了一方法实际上就是执行调度(1)   ——比;它利用递归重新进来取出下一个中间件函数接着执行   fn (res,要求调度。绑定(null, i + 1))   ——比;这也是为什么中间件函数能有三个参数,在调用时我们传进来了   */回报的承诺。解决(fn (res,要求调度。绑定(null, i + 1)));   }   }   }      

使用<代码>写代码>      

如何从零开始手写Koa2框架