Koa 是一个基于 Node 实现的一个新的 Web 框架,它是由 Express 框架的原班人马打造的。它的特点是优雅、简洁、表达力强、自由度高。它更 Express 相比,它是一个更轻量的 node 框架,因为它所有功能都通过插件实现,这种插拔式的架构设计模式,很符合 Unix 哲学。
Koa 框架现在更新到了 2.x 版本,本文从零开始,循序渐进,讲解 Koa2 的框架源码结构和实现原理,展示和详解 Koa2 框架源码中的几个最重要的概念,然后手把手教大家亲自实现一个简易的 Koa2 框架,帮助大家学习和更深层次的理解 Koa2,看完本文以后,再去对照 Koa2 的源码进行查看,相信你的思路将会非常的顺畅。
本文所用的框架是 Koa2,它跟 Koa1 不同,Koa1 使用的是 generator+co.js 的执行方式,而 Koa2 中使用了 async/await
,因此本文的代码和 demo 需要运行在 Node 8 版本及其以上,如果读者的 Node 版本较低,建议升级或者安装 babel-cli
,用其中的 babel-node
来运行本文涉及到的代码。
洋葱模型
Koa 框架有哪些不足的地方?
框架能力:
工程化:
搭配生态中的第三方包,也能构建出大型的工程,但是在这个过程中,对开发人员自身的代码架构设计能力就有很高的要求了,不然就全是面条状的代码,给测试和维护带来很高的成本。
参考资料:
路由 静态文件 测试 日志 进程管理
https://www.cnblogs.com/tugenhua0707/category/1372178.html
学习 Koa 源码的整体架构,浅析 Koa 洋葱模型原理和 CO 原理https://juejin.im/post/5e69925cf265da571e262fe6
Koa2 进阶学习笔记https://chenshenhai.github.io/koa2-note/
class IP {get ips() {const proxy = this.app.proxy;const val = this.get(this.app.proxyIpHeader);let ips = proxy && val ? val.split(/\s*,\s*/) : [];if (this.app.maxIpsCount > 0) {ips = ips.slice(-this.app.maxIpsCount);}return ips;}get ip() {if (!this[IP]) {this[IP] = this.ips[0] || this.socket.remoteAddress || '';}return this[IP];}}