从入门到精通的koa2(总结)
Koa已经被释放快六年了。作为继express之后节点服务框架最大的黑马,有很多设计思路值得借鉴。从简单到复杂一步步介绍koa,适合新老人们阅读。
介绍
此处引用中文官方网站原文
Koa是一个全新的web框架,由Express背后的原始团队打造,致力于成为web应用和API开发领域更小、更具表现力、更健壮的基石。通过使用异步函数,Koa可以帮助您丢弃回调函数,并有效地增强错误处理。Koa不捆绑任何中间件,但提供了一套优雅的方法来帮助您快速愉快地编写服务器端应用程序。因为它是一个web框架,所以我们必须熟悉它。通过启动一个节点http服务器并监听一个端口,我们可以通过localhost:3000在本地访问我们的服务。这个服务可以是一个网站、一个restful接口、一个静态文件服务等等。
你好
任何语言和框架中都有Hello Word的例子来表达它最简单的介绍性演示。代码如下
此时,访问浏览器localhost:3000,我们会看到Hello Word被打印出来,然后启动了一个基于koa的服务。
语境
理解koa的第一步是理解语境的作用
比如微信群里有人说外面下雪了。当你跑到窗前时,你看到了晴朗的天空。然后你意识到也是十月,他在寒冷的北方,你在炎热的南方
类似地,请求将包含用户的登录状态,或一些信息,如令牌,它是上下文的一部分,用于确定请求环境一次
Koa的Context将节点的请求、响应对象封装成单个对象,并为开发web应用程序和API提供了许多有用的方法。HTTP服务器开发中经常用到的那些直接在Koa中实现,而不是在更高级别的框架中实现,所以中间件不需要重复实现这些常见的功能。
中间件
我们先来看一个官方的例子:
简单解释一下,代码开始初始化一个koa实例,通过use方法加载以下三个中间件方法,执行顺序如下:
进入第一个中间件next(),跳转到下一个中间件new Data(),记录当前时间next(),跳转到下一个中间件,将ctx.body分配回上一个中间件,再次记录当前时间,计算时间差保存在http头中,返回上一个中间件打印头中的X-Response-time
这里的执行顺序扩展了非常经典的洋葱模型
在一个请求的过程中,我们将来回通过同一个中间件两次,允许我们处理不同请求阶段的逻辑
源代码解析
上面介绍了koa中最重要的两个概念。让我们分析一下koa是如何工作的,以及所谓的洋葱模型是如何建立的
koa源代码的lib目录非常简单
lib |-application . js |-context . js |-request . js |-response . js application的类初始化。
入口文件是application.js让我们从这里开始
Application是一个类,继承了节点的Events,这里不详细展开,下面的内容在构造函数中初始化:
代理代理默认不打开中间件中间件,这是一个空数组。这里需要注意的是,env根据环境变量NODE_ENV判断上下文、请求和响应,并通过Object.create方法将lib目录中对应的文件导入到这个的当前上下文中,不会污染对象使用方法的引入。
按照正常的编码顺序,在初始化koa实例(const app=new Koa())之后,我们需要调用app.use()来挂载我们的中间件,那么我们来看看use方法是做什么的。
判断中间件是不是功能,简单的把中间件功能推入中间件阵列。
你现在脑子里有大写的WHAT吗?
其实就是这么直白,没有复杂的逻辑。稍后,您可能已经猜到,中间件中的方法被循环调用来执行。在这里,洋葱模型是如何产生的还没有被展示出来。我们先不要展开它,继续按代码顺序执行。
倾听法
按照正常的编码顺序,使用我们的中间件后,就是app.listen(3000)
让我们看看这个监听器做了什么
这里,http.createServer是节点启动http服务的本机方法。在这里,基础知识略有延伸。此方法接受两个参数
选项【传入消息,服务器响应】仅在节点版本v9.6.0,v8.12.0之后才支持这里,我们不重复requestListener。这个参数是函数类型,在每个请求中传递两个参数,req和RES。不难理解,这里的this.callback()方法一定是返回了一个函数并接收了两个参数(req,res)。让我们看看源代码。
这次回调的信息量有点大,代码本身不难理解,注释也有说明,从上到下都有说明
合成方法
这里的合成方法主要负责生成洋葱模型,通过koa-compose包实现。源代码如下
从注释中可以看出大致的逻辑,这里巧妙的是fn (context,dispatch。绑定(空,I 1))。
这个dispatch.bind(null,i 1)是我们接下来通常编写中间件的第二个参数。
我们从执行next()方法中实际得到的是下一个中间件的执行。
不难理解为什么当我们等待next()的时候,我们在等待所有的中间件被串联执行。回头看,上面中间件的执行顺序会突然变得清晰。
CreateContext方法
展开回调中的解释,查看constctx=this。创建上下文已完成
在这篇论文中,请求,资源,这个。this.request、this.response都挂载在上下文中,通过赋值明确了循环引用的层次关系,为用户提供了方便。
HandleRequest方法
或者在回调中展开解释,看看this.handleRequest(ctx,fn)做了什么
获取ctx生成的洋葱模型并进行合成,开始一个个消费中间件。
上下文. js文件
上文阐明了总体框架。让我们看看上下文中的细节。在文件的末尾有两大部分代理
在这里,您可以看到req和res的所有方法集,因此哪些方法可读,哪些方法可写,哪些方法可读可写,哪些方法不允许修改
这就是代理库的作用。
委托在内部使用__defineGetter__和__defineSetter__的方法来控制读写。当然,我们可以向他们学习思想,不能盲目跟随
在MDN上搜索时,这两个API会给出相同的警告消息
这个特性不赞成使用对象初始化语法或对象定义属性来定义设置器。仍然建议我们使用Object.defineProperty(),这是vue的代理模式。但是这个库已经四年没有更新了,依然运行稳定,依然得到koa开发者的认可。
其他的
request.js和response.js文件中没有什么好谈的,只是具体工具和方法的实现,方便开发者调用。如果你感兴趣,可以自己阅读源代码。
app应用
智联前端架构的整个节点服务都是基于koa实现的,包括我们的vue服务器渲染和node restful api等。
我们选择koa的原因是它轻量级、可扩展、支持异步和等待异步,并且完全摆脱了回调地狱。
也有成熟的基于koa2的企业级解决方案,比如eggjs和thinkjs。
摘要
揭开koa的神秘面纱,让开发者关注业务逻辑以及框架本身,有利于故障排除和编译扩展。同时,他们可以学习express、hapi等等价框架的思想,结合现有的企业级解决方案,选择适合自己的框架。简而言之,不管框架是好是坏,都只讲场景。
以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。
版权声明:从入门到精通的koa2(总结)是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。