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