Node.js 允许开发人员仅使用 JavaScript 构建前端和后端应用程序,这意味着你不再需要在不同的语言之间切换上下文,例如 PHP 用于后端,JavaScript 用于前端。
Node.js 曾经被视为非专业人员的语言,但它确实彻底改变了 Web。如果你在 Node.js 出现之前就已经是一名开发人员,那么你必须学习一种完全不同的语言来编写服务端代码,比如 PHP。然而,由于 Node.js 及其巨大的生态系统,前端开发人员现在也可以使用 JavaScript 与后端一起工作。
使用 Node.js,你可以创建可生产的应用程序,包括实时聊天应用程序、微服务、命令行工具、Web 服务器和 API。由于其事件驱动模型,Node.js 可以处理大量并发请求。许多大公司在生产中使用 Node.js。
在本文中,我们将根据一些流行的 Node.js 框架的用法、特点、缺点、下载量等进行比较。
编写服务端逻辑很复杂,从头开始编写整个应用程序非常耗时。开发人员需要专注于业务逻辑,而不是浪费时间从头开始创建应用程序。通过提供辅助函数、工具和规则,框架可以处理繁重的工作,帮助我们快速构建应用程序并编写简洁的代码。
许多 Web 框架将 Web 协议抽象为更高级别的 API,并为构建 Web 应用程序提供了丰富的接口。通常,这些框架使用了 Node.js 的底层内置功能,并为我们提供了一个更简单的 API 来在我们的 Web 服务器中创建更复杂的功能。当然,框架为我们的代码增加了抽象,但如果你正在构建一个大型 Web 应用程序,它们可以派上用场。
每个框架都试图解决一个问题,每个框架的原理都是不同的。然而,所有 Node.js 框架都有一些共同点,比如将 url 映射到内容,即路由,以及动态内容的模板。
尽管你可能会对学习一个新的框架感到兴奋,但可用的框架的绝对数量可能会让你不知所措。下面的图表可以帮助你了解哪个框架可能是你的项目的最佳选择:
有许多不同的方法来对框架进行分组,有些框架可以属于多个类别。例如,我已经在 REST API 下包含了 NestJS,但你也可以将它作为一个全栈的 MVC 框架使用。或者,你可以直接启动一个 REST API 服务器。
基于 Express HTTP 服务器框架,可以帮助你构建基于 HTTP 动词和路由的应用程序。还有一些流行的 HTTP 服务器框架包括 Fastify(用于后端开发的低开销框架)、Koa(由 Express 团队设计)和 Hapi(NestJS 的替代方案)。
MVC 代表 Model
(模型)、View
(视图)和 Controller
(控制器),这是一种软件架构设计模式,将应用程序功能分为三个部分:
模型处理数据逻辑并表示如何存储数据,视图负责将信息呈现给用户,控制器负责处理请求流,并在模型和视图之间委托信息。控制器将从模型中获取数据信息,然后将数据传递到视图中。
Sails、Strapi 和 AdonisJS 支持 MVC 架构,如果你不想花太多时间构建你的应用程序,你可以使用这些。此外,采用 MVC 架构可以使其他开发人员更容易理解你的代码。
Meteor 和 Feathers 是一些在客户端和服务器端使用 JavaScript 的全栈 Node.js 框架。这些框架具有许多特性,包括模板引擎、WebSocket
库等。
NestJS、Loopback 和 Restify 是 REST API 框架。你可以使用这些框架来启动一个快速的 Node.js 服务器,或者只是处理 CRUD 请求。
下面的图表将告诉你这些框架的受欢迎程度,包括它有多少贡献者,在 npm 上的月下载量,以及框架的年龄:
GitHub stars | Monthly downloads | Contributors | Age | |
---|---|---|---|---|
Express | 59.1k | 27.8M | 295 | 13 years |
Koa | 33.4k | 1.3M | 226 | 9 years |
Hapi.js | 14.1k | 665k | 212 | 11 years |
Nest.js | 52.6k | 1.9k | 353 | 6 years |
Socket.io | 57.2k | 5.3k | 204 | 13 years |
Sails.js | 22.3k | 36.2k | 238 | 11 years |
Fastify | 25.8k | 842.1k | 593 | 6 years |
Loopback | 13.3k | 45.8k | 133 | 9 years |
Adonis | 13.3k | 141 | 70 | 7 years |
Restify | 10.5k | 129.8k | 206 | 11 years |
Strapi | 50.4k | 16.3k | 827 | 7 years |
Meteor | 43.1k | 1.4k | 674 | 10 years |
这些框架大多都很老了,在 npm 上下载最多的领先框架是 Express
。在 Express
之后,我们有 Koa
,还有 Fastify
。至于它们在 GitHub 上的受欢迎程度,Express
和 Socket.io
处于领先地位,Meteor
、NestJS
和 Strapi
紧随其后。
我们将回顾五个最流行的框架,Express
, Koa
, Socket.io
、NestJS
和 Fastify
,探索它们的特性、亮点。
不可否认,Express
是 Node.js 框架之王,在撰写本文时,它在 npm 上的每周下载量约为 2800 万次。它被认为是 Node.js 实际上的 Web 服务器框架。
Express
发布于 2010 年,是用 JavaScript 编写的。在撰写本文时,Express
的最新稳定版本是 V4.18.1。但是,随着新特性的引入,Express
正在迁移到 V5.0.0,在撰写本文时,该版本还处于 beta 测试阶段。
由于 Ruby 的效率和可维护性,Express
受到了 Sinatra 框架的启发。Express
旨在快速构建和运行 Web 应用程序,开发人员喜欢它,因为它轻量级、快速、简约和不拘谨。
Express 提供了路由和中间件等功能,只需几行代码就可以加快处理速度。Express 对于 Node.js 来说只是一个薄层,由于 Node 的异步特性,我们可以并发运行多个请求。因此,Express 提供了高性能和快速的开发体验。
Express 健壮而有弹性的路由系统通过从 Express 应用程序对象派生的 Route
方法处理请求,因此你可以编写对特定端点的响应。
Express 并没有提供一种通用的方式来组织事物,没有严格的规则,所以你可以决定如何构建你的应用程序或使用什么中间件。例如,你可以自由选择任何设计模式,如 MVC
,MVP
,MVVM
等。然而,最常见的是 MVC
模式。
使用 Express,可以很容易地集成第三方服务和中间件来执行解析请求、cookie header、session、security header 等任务,这允许你使用额外的库进行身份验证、数据库访问、会话管理等等。你可以轻松地与 SQL 或 NoSQL 数据库集成。
Express 系统支持超过 20 个模板引擎,以简化生成 HTML。一些流行的包括 Pug
,Mustache
和 EJS
。
Express 拥有庞大的社区、详细的文档和较浅的学习曲线。如果你熟悉 JavaScript,就很容易掌握。事实上,大多数框架都是在 Express 之上构建的。Express 也很容易测试,因为它的中间件和路由模块化了项目。
Express 需要大量密集型任务,比如设置端点和中间件。由于 Express 是独立的,你需要自己配置库和特性。在编写 Express 代码时,你可能会遇到回调地狱。你可以使用 Promise 来解决这个问题。由于 Express 的体系结构,由开发人员团队管理大型项目可能很困难。
Express 非常灵活,你可以构建任何类型的单页、多页或任何大小的混合 Web 和移动应用程序。你可以从构建简单静态文件服务器到 JSON API。
Koa 是现代版的 Express。它更轻盈,更富有表现力,也更健壮。你可以像 Express 一样使用 Koa 创建 Web 服务。实际上,Koa 框架是由 Express 背后的团队设计的,它有时被称为 Express 的未来。该团队减少了 Express 中的中间件包,使用现代 JavaScript 语法对其进行了改进,并为开发人员提供了更多的自由。
如果我们比较 Koa 和 Express,我们可以看到 Koa 已经删除了 Express 中的大部分功能。Koa 是非常不固定的,它没有提供现成的路由、模板引擎或 JSONP。这背后的主要原因是使 Koa 更快,给开发人员更多的自由,在编写代码时减少复杂性。
Koa 还提供了更多定制选项。因此,如果开发人员想要使用中间件,他们可以自己创建它或使用内置中间件。Koa 提供了诸如 Koa router、Koa EJS 模板、Koa BodyParser 等附加模块。
Koa 更关注 JavaScript ES6 语言的现代特性,比如 generator、async 函数和 Node.js runtime。Koa 使用基于 promise 的流和 async-await 语法来消除回调,使代码更易于管理、更清晰、更可读。Koa 利用 ES2015 generator 语法来定义中间件,而不是回调。你可以使用 yield 关键字退出,然后重新进入。
Koa 使用 context
对象,它将 req/res
对象封装为一个对象,通过使用几种有用的方法帮助开发人员更有效地构建 API。最后,Koa 使用级联中间件。中间件通过异步函数以级联方式运行,直到到达最后一个中间件。
如果你了解 Express,那么 Koa 很容易学习,并且只有 600 行代码,它可以帮助开发人员编写更薄的中间件。与 Express 相比,Koa 在每秒处理更多请求方面性能更好,并且可以更好地控制 try…catch
,并且更加模块化。由于它的模块化,在 Koa 中重构较大的代码库很容易,并且它为开发应用程序和 API 提供了最小的接口。
Koa 与 Express 风格的中间件不兼容,它使用 ES6 generator,而 ES6 generator 与来自其他框架的中间件不兼容。generator 使得将来迁移到其他 Node.js 框架变得更加困难,并且它与框架建立了紧密耦合。最后,Koa 没有内置中间件,像 req
、res
和 next
这样的传统中间件不能与 Koa 一起工作。
Koa 非常适合构建可伸缩的轻量级 Web 应用程序、HTTP API 和单页 Web 应用程序。
Socket.io 主要用于构建实时聊天应用程序,如 QQ 和 微信。它在 Web 客户端和服务器之间建立双向通信:
为了更好地理解这一点,我们需要了解客户端和服务器通常如何通过 HTTP 进行通信。客户端发出请求,服务器响应客户端的请求。但是,这是单向的交流,服务器无法主动与客户端的通信,因为 HTTP 协议是无状态的,并且服务器很难找到正在访问它的所有不同客户端的 IP 地址。
在某些情况下,服务器需要实时更新客户端。例如,如果我们有一个聊天应用程序,服务器应该立即向所有用户广播新消息。我们不需要使用 HTTP 连接,而是需要使用 WebSocket
,它允许前端和后端之间进行实时的双向通信。
Socket.io 有两部分,运行在浏览器上的客户端库和 Node.js 的服务器端包。这两个组件都有一个几乎相同的 API,因为我们可以在浏览器和服务器中运行代码。它遵循 Node.js 的 EventEmitter
模型。为了使 WebSocket 工作,客户端打开一个到服务器的持久连接,双方可以互相发送消息。
Socket.io 为 Node.js 应用程序提供了可靠的 WebSocket 连接。它以更少的代码行提供实时分析,并提供高速支持。
如果服务器和客户端不同意握手,则 Socket.io 退回到长轮询,并支持其他协议,如 WebSocket、Flash、XHR和 JSONP。它可以支持多种浏览器。
Socket.io 还支持二进制和多路复用。我们可以从客户端或服务器端发送任何 blob
数据,如图像、音频或视频。
此外,Socket.io 框架提供自动重连接支持。如果客户端断开连接,它将继续重试,除非手动停止。最后,Socket.io 具有自动错误检测和纠正功能,即使在代理和私有防火墙存在的情况下,它也能建立深度连接。
Socket.io 内置了对添加中间件的支持,并提供了一种更直接的方式来设置音频和视频流功能。它很容易上手,而且可以快速开发应用程序。最后,Socket.io 有一个很大的社区,所以很容易找到学习资源。
Socket.io 使用回调,并且它不提供任何消息保证来确认它收到了消息。因此,我们需要在应用程序中编写自定义逻辑来处理这种情况。
Socket.io 对于视频会议应用程序、交互式流媒体、多人游戏和动态更新的社交网络站点非常有用。
受 Hapi 和 Express 的启发,Fastify 声称是最快的 Web 框架,根据它的基准测试,它的速度是 Express 的两倍。Fastify 落后于 Express 的唯一情况是处理空请求。Fastify 专注于通过强大的插件架构最小化性能开销,同时保持开发者的体验。
根据 2021 年 JS 调查,Express 是使用最多的后端框架,占 81%,其次是 Next.js,占 45%。Fastify 紧随其后,占 11%。
Fastify 自动解析 JSON,提供高效渲染和快速路由。因此,它具有很高的性能,每秒可以处理多达 30,000 个请求。
Fastify 是可扩展的,其拥有由 200 个插件、钩子和装饰器组成的生态系统。Fastify 也可以很好地与 TypeScript 一起工作,支持 AWS Lambda,有一个 GraphQL 适配器,并附带一个轻量级记录器。
最后,Fastify 会优雅地关闭应用程序。它会停止接受新的连接,并在退出进程之前关闭所有未完成的“keep alive”连接。
Fastify 在生产中提供了零开销、自动安全和数据验证、对语义版本控制的长期支持,以及用于在控制器中编写异步代码的更干净的语法。使用 Fastify,测试很容易,为开发人员带来很棒的体验。
Fastify 并没有一个庞大的社区。因此,如果遇到 bug,你可能需要自己修复它。此外,Fastify 具有共享所有权原则,这意味着你可以创建一个 PR 并为社区做出贡献。
微软、Hotstar 和 Future Foundry 都使用 Fastify。虽然你可以使用 Fastify 来创建 Web 应用程序,但当你构建基于 json 的 API 时,它更出色。Fastify 适用于小型和大型项目。你可以轻松地迁移到微服务,甚至无服务器,然后再返回。
NestJS 是一个渐进的、灵活的、通用的 REST API 框架,以构建高效、可靠和可扩展的服务器端应用程序而闻名。
Nest 使用现代 JavaScript,使用并支持开箱即用的 TypeScript。它结合了面向对象编程、函数式编程和函数式响应式编程的元素。
NestJS 内部构建在 Express 之上,但是你也可以用 Fastify 来配置它。NestJS 的灵感来自 Angular,它使用依赖注入、模块化和装饰器的概念。你可以构建 MVC 应用程序、REST 和 GraphQL API。NestJS 提供了一个内置的 Apollo GraphQL 包装器。
NestJS 提供了一个强大的 CLI 来提高工作效率并简化开发过程。它还支持开箱即用的 REST 和 GraphQL API,你可以使用它来构建一个全栈应用程序。
NestJS 提供了一个现成的选项来构建基于微服务的应用程序。当你启动一个 NestJS 服务器时,它有一个基于几个简单组件的清晰架构,比如控制器、模块和提供程序。这使得将应用程序拆分为微服务变得很容易。
最后,NestJS 为应用程序提供了简单的单元测试,包括用于各种应用程序测试的专用设置。
由于 JavaScript 的灵活性和 TypeScript 的健壮性,NestJS 很容易扩展。它包括详细的和维护良好的文档,具有活跃的代码库开发和维护,并且使用 MIT 许可证开源。
NestJS 代码生成有助于更快地开发应用程序,它遵循严格的设计原则,为开发人员做了大量基本的开发活动。 NestJS 的社区正在迅速发展。
NestJS 使用 Angular 的概念,所以对于不熟悉 Angular 的开发人员来说,刚开始可能很难掌握 NestJS。与 Express 相比,NestJS 社区很小。
NestJS 非常适合构建复杂的大型企业应用程序。
在本文中,我们介绍了很多内容,首先介绍了为什么应该使用框架、框架的类型以及关于不同框架的一些统计数据。然后我们浏览了五个最流行的框架,包括 Express、Koa、Socket.io、Fastify 和 NestJS。希望本文能让你更好地了解每个框架的不同之处。