写点什么

koa2 快速入坑

  • 2019-09-15
  • 本文字数:2231 字

    阅读完需:约 7 分钟

koa2快速入坑

为啥入坑 koa2?


  • koa2 小而美,相比 express 更小、更健壮、更富有表现力;

  • 全面支持 ES6/ES7 语法;

  • 结构优雅,易于扩展,360 的 thinkjs,阿里的 egg.js 全部基于 koa2 开发,源代码只有 4 个文件,500 行代码;

  • 站在 2018 年的节点来看,Koa2 的学习大潮已经到来。

Node.js 技术栈 Web 服务框架的发展

没有轮子的年代


早期 nodejs 就提供了 http 服务的能力,当时人们已经开始尝试使用 nodejs 提供 web 服务,类似这样:



没有轮子,高级一些的功能和用法全部需要自己编码实现。。。


英雄登场


为了降低人们的重复性劳动,更高效的使用 nodejs 搭建 web 服务,人们开始发明各种轮子。express 是其中最流行的 web 框架,后来又出现了 koa,koa2,hap。



再后来,基于 koa,又出现了一些企业级的开发框架,例如 360 的 thinkjs,最近,阿里也开源了它的基于 koa2 的框架-egg.js。这也证明了 koa 框架本身结构分拆的优秀,然而,无论是 express 还是 koa,这些框架都来自一人之手,TJ。


TJ 何许人也,前端的小伙伴们可能了解这位大神。看下面这个图:



他的自我介绍:


TJ Holowaychuk,程序员兼艺术家,Koa、Co、Express、jade、mocha、node-canvas、commander.js 等知名开源项目的创建和贡献者。


社区影响:


https:// nodejsmodules. org 第一页出现次数最多的那个少年,


高产到令人发指,Quora 上甚至有人猜测 TJ 不是一个人,而事实上他就是一个人。


substack/npmtop:对 node npm 社区代码贡献截止目前占到整个社区的 3.04%。



好,膜拜完大神,我们继续看 nodejs 框架的发展。


初代英雄 Express 诞生



Express 早期提供了 web 服务器各种常用功能的全家桶,提供了例如路由、表单解析等功能模块,中后期做了大量的拆分,将大部分模块都独立出来官方自行维护,或者是采用社区其他开发者提供的中间件模块。虽然进行了拆分,但 Express 总体来说是相对大而全,API 较为丰富的框架,并且它的整个中间件模型是基于 callback 回调,而 callback 随着逻辑增多,会出现 callback hell 的问题。


而且 express 对于中间件完全是顺序调用的,对于一些需要流程控制的场景,解决方案比较复杂。于是 TJ 大神开动异于常人的脑回路,设计了 Koa。


二代目-Koa 登场 - 我们不一样




Koa 从一开始就选择了跟 Express 完全不同的架构方向。


首先 Koa 与 Express 是在做同样事情上的不同实现,所以意味着他俩对外提供的能力大部分是相同的,我们看不同的地方:Koa 从一开始就是按照功能模块划分,各司其职。koa 的 context,也就是 ctx,上面有很多引用,最核心的是 request 和 response,这俩可以对应到 Express 两个对立的 req 和 res,在 Koa 里面,把它俩都集中到 ctx 里面进行管理,分别通过 ctx.request 和 ctx.reponse 进行直接访问,原来 Express 两个独立对象做的事情,现在一个 ctx 就够了,上下文对象都在他手中,想要联系谁就能联系谁。 其次是它的中间件机制,Koa 真正的魅力所在,后面中间件环节,我们会对此进行介绍。


三代目 koa2




  • 函数式编程

  • ES7 官方标准异步方案:async/await


你值得拥有


目前的 koa 官方 github 已经全面的使用 koa2 版本的代码了,并且有一句非常重要的提示 Koa requires node v7.6.0 or higher for ES2015 and async function support.。意思是说,koa 需要至少 node v7.6.0 版本和 ES2015(es6+async)才能使用。


koa2 结合了 async/await 已经成为了最好的 web 开发框架。


Koa1 和 koa 框架模型,API 基本相同,但是两者的中间件互不兼容,(底层实现不同),官方提供了方便的升级工具,可实现升级。


koa2 框架定位:


–更小、更健壮、更富有表现力;


–免除重复繁琐的回调函数嵌套;


–极大地提升错误处理的效率;


–轻量、优雅,仅提供 web 服务最基础的函数库;


–通过中间件扩展实现不同的高级需求;


koa2 的源码只有四个文件,500 行左右。只提供封装好 http 上下文、请求、响应,以及基于 async/await 的中间件调用机制。源码阅读此处不具体展开,有兴趣可以阅读下。



以下对 koa2 的语法进行简单介绍


首先是创建一个服务实例:



上图中,app.use(function)方法中的 function 就是一个最简单的中间件,通过多次 app.use()方法可以在 koa2 框架中注册多个中间件。如下图所示:



与 express 最大的不同点,就是中间件再也不是顺序执行,而是类似洋葱和堆栈,先进后出的流程,这样可以提供更好的流程控制,例如日志处理。


著名的洋葱模型:



以上代码请求结果如下图所示:



路由


koa2 本身不提供路由模块,但是通过引入独立的路由模块,就可以提供类似 express 的路由能力,代码如下图:




以上方式实现了接口和业务逻辑的分离,可以提高业务逻辑代码的复用,职责分离。


静态资源服务


koa2 通过引入独立的模块,可实现类似 nginx 的静态资源服务能力,如果不需要反向代理等能力,甚至都不需要部署 nginx 了。可参考以下代码:



SSR 后端渲染


为了提高首屏加载速度,有时候需要进行后端渲染,koa2 通过加载其他模块也可以支持,代码参考如下:


# 安装koa模板使用中间件 npm install --save koa-views# 安装ejs模板引擎 npm install --save ejs
复制代码




mongodb 数据库操作



MySQL 数据库操作



以上,对 koa2 的一些常见语法给出了样例参考。


2018 年 koa2 的生态系统已经比较完善,各大厂也基于 koa2 进行了封装,开源了一些面向工程和业务实践的框架,例如 egg.js。


关于 Koa2 的讲解就先分析到这,希望对大家有所帮助。如有不同的看法,欢迎交流!


本文转载自公众号滴滴技术(ID:didi_tech)。


原文链接:


https://mp.weixin.qq.com/s/0KhR3on2kW8Mc-rkJzqT8Q


2019-09-15 23:181437

评论

发布
暂无评论
发现更多内容

转转平台IM系统架构设计与实践(一):整体架构设计

JackJiang

即时通讯;IM;网络编程

BOE(京东方)全新概念级“AI视听中心”亮相CES 2025 携手高通引领智慧家居娱乐新图景

爱极客侠

语音技术与人工智能:智能语音交互的多场景应用探索

天津汇柏科技有限公司

AI 人工智能

pd19虚拟机永久许可证 Parallels Desktop 19下载安装

Rose

JimuReport 积木报表 v1.9.3发布,免费可视化报表

JEECG低代码

数据可视化 报表 报表工具 报表打印 大屏设计器

代码编辑器 sublime text破解安装包 附sublime text汉化补丁

Rose

苹果Mac远程管理Royal TSX使用教程

Rose

WebGL在医学领域的应用

北京木奇移动技术有限公司

软件外包公司 webgl开发 医学领域

企业如何实现多源异构数据的统一化管理?

Aloudata

数据分析 数据管理 数据集成 数据虚拟化 数据编织

@你,请查收:KaiwuDB 2024 年度总结

KaiwuDB

数据库 分布式多模

数据集成和分析时,应该注意哪些关键因素?

Aloudata

数据分析 数据虚拟化 数据编织

Java分析工具 JProfiler for mac注册码及安装教程

Rose

KubeEdge SIG AI 产业革新与应用:跨越边界,迎向未来

华为云原生团队

云计算 容器 云原生

Set A Light 3D Studio:打造专业级3D灯光布局,摄影布光从此得心应手

Rose

观测云产品更新 | 日志索引、Pipeline、场景图表等优化

观测云

产品迭代

iZotope音乐制作 Ozone Advanced 11直装版下载安装

Rose

AIP智能体平台:赋能软件开发与运行的新时代

大东(AIP内容运营专员)

人工智能

WebGL开发虚拟解剖系统

北京木奇移动技术有限公司

软件外包公司 webgl开发 医学解剖

一个测试Leader的工作案例

老张

团队管理 项目管理 软件测试 自动化测试

【连载 10】CountDownLatch

FunTester

淘宝天猫API接口深度解析:商品详情与关键词搜索商品列表的高效应用

代码忍者

苹果Mac版SVN客户端 SnailSVN Pro 免激活版

Rose

Typeeto for Mac:让Mac键盘秒变蓝牙键盘,跨设备输入更高效

Rose

企业流程自动化:AI技术加持,解锁高效运营

合合技术团队

人工智能 AI 自动化 数据治理

MestReNova 14:精准解析NMR数据,助力科研突破!

Rose

定制 CRM 的4个真实用户案例(帮你选择更灵活CRM产品)

NocoBase

开源 CRM 定制化 CRM系统 案例研究

koa2快速入坑_文化 & 方法_翟广鹏_InfoQ精选文章