2020年面向Web应用的最值得关注的Node.js框架

2020-12-15大约72分钟

在2020年,越来越多的企业为了给用户提供更好的体验,用更好、更快的技术通过web应用程序来为用户提供服务。后端技术的选择也很多,Java、C#、Go等语言都是不错的选择,根据Node.js用户调查报告,在5个后端或全栈开发人员中,就有4个将Node.js框架作为首选的后端技术。虽然这个报告的结论可能比较偏颇,但也能证明Node.js的确是一种比较受欢迎的一个选择。

如果选择了Node.js,我们仍然需要选择一个适合自己需求的web框架。网上Node.js有许多不同的框架,这些框架的功能都十分强大,具有丰富的功能。因此,如何选择一个框架也是一个比较头疼的问题,有些人在乎轻量、灵活、速度,有些人在乎更丰富的功能、开箱即用等。

在本文中,我们根据框架在开发人员中的流行度和使用情况,列出了十大最受欢迎的Node.js框架。还讨论了在Web应用程序开发期间何时使用它们,以及为什么使用它们执行特定任务。

Node.js是否是一个框架?

关于Node.js是否是框架,存在着长期的争论。很多时候,我个人认为Node.js并不是一个框架,而是一个JavaScript运行时环境:一个在服务器端执行JavaScript代码的平台。用外行的话来说,运行时环境是开发人员运行程序的地方。运行时环境提供的功能都很基础,比如访问本地文件、调用JS执行引擎等,但要构建一个实用的Web应用,那么Node.js所提供的功能就显得太初级了,我们需要更便利的方式。

框架呢?则是一套具有更丰富的功能、有明确的使用规则的一个或多个代码库,框架一般都把Web应用的核心都实现好了,你只需要正确地在项目里添加自己的业务功能代码就可以了。现在已经有大量开源的Node.js框架,比如Express.jsKoa.js等,为Node.js应用程序创建了独特的功能,从而为软件工程师提供了更多的便利。

什么是Node.js框架?

每种Web应用程序技术都提供不同种类的框架,每种框架都支持开发生命周期中的特定用例。Node.js框架主要分为三种类型:MVC,全栈MVC和REST API框架。

**MVC框架 **

这些框架提供了一种有价值的设计模式,该模式将应用程序逻辑分为三个基本部分:模型(M odel),视图(V iew)和控制器(C ontroller)。对开发中的关注点进行分离,使维护和扩展应用程序变得极为简单。Express.js就是MVC框架的经典示例。

全栈MVC框架

在构建一个大型应用程序时,全栈MVC框架会提供大量的脚手架,库,模板引擎以及一系列其他开发功能,使得开发者更容易通过团队协作、更快速地来开发功能。此外,这些框架也可以照顾应用程序的前端和后端开发。Hapi.jsMeteor.js就是这样的代表。

REST API框架

多数的Node.js框架都可以用来快速地构建的REST API,比如Express.js,不过用这种通用的web框架会显得有点笨拙:框架提供的大部分功能用不上,要用的功能框架提供的又不是很完善。因此,也有专门的框架来支持Rest API的开发,比如Feather.js

趋势:最受欢迎的Node.js框架

根据2018年Node.js网络调查报告,Node.js在很大程度上提高了开发人员68%的生产力,降低了开发成本并提高了应用程序性能。这是成功采用和部署node.js框架的结果。

纵观趋势,Express.js将自己定位为极简且不受限制的框架,是最受欢迎的框架,拥有超过51000个Github星星。考虑到当前的开发需求,CTO倾向于采用框架来帮助他们最大程度地减少资源消耗并缩短营销时间。

Express、Next.js、Meteor,Nestjs,Total.js等框架以最适合2020年开发需求的特征引领这一趋势。

接下来,让我们看一下具体的这些框架(具体Github星星数据来自于2020年11月30日的当天数据)。

1. Socket.io

图片

Github星星 :51.8k

Socket.io是一个Javascript库,用于构建实时应用程序以及在Web客户端和服务器之间建立双向通信。使用此库框架,您可以开发具有websocket开发要求的应用程序。例如,像仪表板API,计分票,聊天机器人等应用程序会连续运行以进行实时更新,并刷新后台进程以获取更新或消息。它还以更少的代码行提供实时分析。这是一个websocket体系结构,可以由不同的编程语言使用。与常规的Node.JS Web应用程序框架相比,在实时通信和协作方面,它具有很大的优势。

Socket.io的主要功能如下:

  • 协助多路复用,异常检测,自动校正等。
  • 二进制支持(带有客户端库和服务器端库)
  • 实时分析
  • 自动重新连接支持
  • 自动创建所有套接字的标识符
  • 自定义Web套接字的URL路由的能力

何时使用Socket.io

Socket.io适用于开发实时应用程序,例如聊天室应用程序,视频会议应用程序,多人游戏和其他应用程序。在这些应用程序中,服务器需要推送数据而无需客户端轮询请求。例如,像Zoom这样的实时视频通话应用程序需要将实时双向数据传递给多个参与者。

如果您有实时通信方面的需求,但又觉得Socket.io的功能不够全面,那么在选择框架时,您可以选择那些支持Socket.io同时又提供更全面功能的框架来结合起来使用,比如Feathers.js,这样您就能可以获得更加强大的功能。

2. Express.js

图片

Github星星 :51k

Express是用于Node.js Web开发的独特而小型的框架,该框架可帮助开发人员以更快的速度开发桌面和移动应用程序,并具有许多组合功能,从而使可扩展性和速度成为首要任务。

由于Express是轻量级的,因此可以与NPM公共模块库里许多其他的模块完美地配合使用。除此之外,Express还具有令人难以置信的API,旨在确保最佳性能的同时,又不对Node.js的功能进行妥协。

Express.JS的基本功能包括:

  • 快速的服务器端编程软件包——该框架具有许多现成的开箱即用的功能,也有很多处理各种功能的中间件,可以让你用很少的代码就能实现想要的功能。
  • 高性能。
  • 超高的测试覆盖率。
  • 无数的HTTP helper代码——它们使程序更易懂,可重用。
  • 更好的内容协商——通过提供URL的HTTP标头来帮助用户/客户端获取准确的信息,这有助于客户端和服务器之间更好的通信。
  • MVC架构模式

何时使用Express.js

您可以使用该框架更快地开发Web应用程序,这个框架也具有非常庞大的支持者和用户,也能够快速上手。如果在使用过程中遇到问题,很容易从网上找到解决方案。不过,由于框架的目标是提供一个轻量的框架,那么在使用的时候,你可能还需要花一些额外的时间来找一些的Express中间件来满足自己更多的需求,还需要一些配置工作,这是轻量级框架普遍存在的问题。如果你希望快速构建一个demo程序或小型网站,那么Express可能很适合你,不过希望构建大型的Web应用,不妨也综合考虑一下本文后面介绍的其他的框架。

3. Next.js

图片

Github星星 :57.8k

Next.js可以让你利用React.js来快速地构建一个网站,而不用关心如何处理服务器端渲染(SSR)、客户端渲染(CSR)、代码Bundling之类的代码实现和配置等繁琐的步骤。在有些介绍里,Next.js不像Express.js那样用传统的MVC的架构来设计服务器端的代码,而是从一个Web应用角度,让你可以直接进入到网站的页面内容设计,因此可以更快地实现一个支持复杂动态交互的页面。

Next.js的基本功能:

  • 混合的SSG和SSR:可以同时支持服务器端build的时候生成静态的内容和运行时服务器端渲染生成动态的页面
  • 零配置:自动编译和bundling,从一开始就支持生产环境级别的优化。
  • 文件系统路由:pages目录下的组件自动生成一个页面路由。
  • 快速刷新:写代码同时就能实时看到修改的页面效果,提高开发效率。
  • 国际化支持:内置的域和子域的路由,自动探测语言。
  • 图片优化:自动对代码里的图片进行大小、缓存等优化

何时使用Next.js

如果你要用React.js来构建完整的站点,那么Next.js可能是一个比较好的选择,你可以快速地实现一个由React.js渲染出来的页面,不管是SSR还是CSR。如果使用传统的MVC模式的server端的框架,则需要自己处理一大堆跟编译和bundling有关的事情,对初学者来说,用Express来构建React的应用,会让人非常的头疼。

因为Next.js的侧重点是偏向前端,因此后端API开发的支持会比较弱,你需要自己去找合适的库去查数据库、发网络请求等,也需要自己去设计服务器端代码的结构。用别的语言或框架来搭建API,让Next.js更专注于UI端的功能,会是一个更好些的选择。

有许多程序员也喜欢用Create React App这样一个框架来实现用React来创建的站点,这个项目的Github星星数量高达84.2K,远远多于本文中提到的其他项目,不过鉴于Create React App更适合一个新的React开发者上手来使用,而缺少一些Next.js具备的SSR/CSR等实用的功能,因此在本文中只是在此提一下,不做更多的推荐。

4. Meteor.js

图片

Github星星 :42.1k

Meteor是一个全栈的JavaScript应用平台,用来构建Web和移动端程序,包括桌面端、Web、IOS和安卓系统。只需要用一份JS代码,你就可以为现代的Web和移动设备开发应用。

Meteor.JS的主要功能:

  • 消除了更新移动应用程序的需求
  • 与Mongo,Vue,Angular,React等无缝集成
  • 不同设备的相似代码
  • 轻巧的结构
  • 在客户端和服务器端组件上可能共享相似的API

何时使用Meteor.js

感觉Meteor.js最突出的一点是可以支持Web和移动端的应用的构建,这时很多其他的框架不具备的功能。

有些点需要注意一下:

  • 对MongoDB的支持很好,但如果你不想用MongoDB,那么则要多考虑一下。
  • 国内的用户比较少,中文的支持会比较有限。
  • Meteor所说的一个语言 ,即JavaScript语言,当我们用Node.js和React来构建应用的时候,其实都也是只有一个语言,这个并不是Meteor所独有的优势。

5. Nest.js

图片

Github星星 :32.2k

Nest是一个用于构建高效,可扩展的Node.js服务器端应用程序的框架。它使用渐进式JavaScript,使用TypeScript构建(保留与纯JavaScript的兼容性),并结合了OOP(面向对象编程),FP(功能编程)和FRP(功能反应编程)的元素。

Nest受到Angular的启发,在服务器端提供开箱即用的应用架构,让开发人员和图团队能够创造出高可测试、可扩展、松耦合、易维护的应用。

Nest的特征:

  • 用于模块化结构和功能的CLI
  • 平滑的学习曲线
  • FRP(功能性反应式编程)简化了复杂的图形用户界面(例如游戏,机器人)
  • 是一个渐进式的JS框架,易于使用的外部库
  • 与前端的Angular高度兼容
什么是渐进式的JavaScript框架
就是用这个框架,一开始不需要你完全掌握它的全部功能特性,可以后续逐步在项目里使用这个框架更多的功能,而不是像一些强主张的框架一开始就必须用这个框架规定好的一大堆东西。

何时使用Nest.js

Nest.js构建高效且可扩展的Web应用程序。当需要开发特别大型的项目时,它可以保持代码结构干净和模块化,从而帮助开发人员构建更具可扩展性和易于维护的应用程序。

6. Koa.js

图片

Github星星: 30.3k

Koa是Node.js框架之一,致力于创造各种Web服务(也称为API)。使用Koa,构建这些API变得非常有趣和轻松,因为它可以使用类似堆栈的方法有效地处理HTTP中间件。

Koa不再使用nodejs的req和res,而是封装了自己的ctx.request和ctx.response。Express可以看做是nodejs的一个应用框架,而Koa则可以看成是nodejs 的http模块的抽象。和Express提供了Middleware,Routing,Templating,Sending Files和JSONP等特性不同的是,Koa的功能很单一,如果你想使用其他的一些功能比如routing,sending files等功能,可以使用Koa的第三方中间件。

特点

  • 异常处理错误
  • 具有级联的中间件(个性化用户体验)
  • 清理缓存,支持代理和内容协商
  • 有更多定制选项;允许从头开始构建应用

**何时使用Koa.js **

当你需要一个非常轻量的框架作为内核来构建更强大的框架,或者比较在乎自己应用的性能,那么可以考虑Koa.js。但对于大项目,由于Koa.js本身提供的功能不多,需要借助大量的中间件来完成,并不是很友好。

7. Fastify

图片

Github星星: 16.5k

Fastify是一个Web框架,高度专注于以最少的开销和强大的插件体系结构为开发人员提供最佳的体验。它受到Hapi和Express的启发,从框架本身层面来说,它号称是最快的Web框架之一。

核心功能

以下列出的是 Fastify 已经实现的主要功能及原理:

  • 高性能: 据我们所知,Fastify 是这一领域中最快的 web 框架之一,另外,取决于代码的复杂性,Fastify 最多可以处理每秒 3 万次的请求。
  • 可扩展: Fastify 通过其提供的钩子(hook)、插件和装饰器(decorator)提供完整的可扩展性。
  • 基于 Schema: 即使这不是强制性的,我们仍建议使用 JSON Schema 来做路由(route)验证及输出内容的序列化,Fastify 在内部将 schema 编译为高效的函数并执行。
  • 日志: 日志是非常重要且代价高昂的。我们选择了最好的日志记录程序来尽量消除这一成本,这就是 Pino!
  • 对开发人员友好: 框架的使用很友好,帮助开发人员处理日常工作,并且不牺牲性能和安全性。
  • 支持 TypeScript : 我们努力维护一个 TypeScript 类型声明文件,以便支持不断增长的 TypeScript 社区。

**何时使用Fastify.js **

如果是开发API接口,又希望框架轻量、又有很好的性能,那么Fastify.js可能就是一个不错的选择。但如果是做一个可以生成网页的网站,那么Fastify.js从框架层面提供的性能优化可能就不是那么重要了,毕竟通常框架不是系统的性能瓶颈,复杂的业务逻辑和I/O通信才是。

8. Feathers.js

图片

Github星星: 13k

Feathers是一个轻量级的Web框架,用于使用JavaScript或TypeScript创建实时应用程序和REST API。Feathers可以与任何后端技术进行交互,支持十几个数据库,并可以与任何前端技术(例如React,VueJS,Angular,React Native,Android或iOS)一起使用。数分钟内即可建立原型,数日内即可投入生产。

特点

  • 专为JavaScript和TypeScript构建:Feathers使用最新的语言功能,是一个小型库,它提供了创建复杂应用程序的结构,但足够灵活,不会妨碍您使用。
  • 灵活的插件:Feathers是具有大量插件生态系统的“包含电池但易于更换的框架” 。包括您所需要的,不多不少。
  • 数据存储无感知:Feathers提供了适用于12多个数据库的适配器。您可以在一个应用程序中拥有多个数据库,并由于一致的查询接口就可以毫不费力地将它们换出。
  • 通用:Feathers可以在带有Node.js的服务器上和带有React,Angular,VueJS等框架的浏览器中以相同的方式使用,也可以在带有React Native的移动设备上以相同的方式使用。
  • 面向服务:Feathers从一开始就为您提供了构建面向服务的应用程序的结构。当您最终需要将应用拆分为微服务时,这是一个简单的过渡。
  • 即时实时REST API:Feathers通过Services提供即时CRUD功能,并通过websockets自动公开RESTful API和实时后端。

**何时使用Feathers.js **

如果是开发API接口,并且希望框架提供了强大的功能及丰富的扩展,那么Feathers就很适合。

乐码范的后端API接口就是基于feather.js来开发的。

9. Hapi.js

图片

Github星星: 12.9k

Hapi.js 是一个用来构建基于 Node.js 的应用和服务的富框架,使得开发者把重点放在便携可重用的应用逻辑而不是构建架构。内建输入验证、缓存、认证和其他 Web 应用开发常用的功能。

特点

  • 插件式注册服务
  • 开销最小
  • 安全默认值
  • 丰富的生态系统
  • 快速轻松地修复错误
  • 与MySQL,MongoDB和其他数据库兼容
  • 与Rest API和HTTPS代理应用程序兼容
  • 默认缓存,身份验证和输入验证

何时使用Hapi.js

Hapi.js在开发更安全、可扩展、实时和社交媒体的应用程序时非常好用,具有丰富的官方插件,比较适合开发大型的网站。这个也是nearForm比较推荐的Node.js框架,乐码范的网站前端服务就是基于Hapi.js建立起来的。