2025 年了,Node.js 服务框架怎么选?

大家好,我是刘布斯。

最近在开发一个 Node.js 服务,计划作为团队基建的一部分,功能上也比较简单,封装一些第三方服务的接口,也就是大家熟悉的 BFF 层。

正好趁着这个机会,对 Node.js 的框架做了下调研,大家一块来看看,现在的国内外,到底有哪些优秀的框架吧。

为什么推荐使用框架 

在开始介绍框架前,我们先来聊聊,为什么推荐使用框架。

有不太熟悉服务端开发的同学可能会有疑惑,通过 Node.js 中的 http 模块可以直接创建服务器实例,有没有必要使用框架呢?

const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type''text/plain' });
  res.end('Hello, World!\n');
});

const port = 3000;
server.listen(port, () => {
  console.log(`Server running at http://localhost:${port}/`);
});

其实从开发效率、代码规范、性能、生态等方向来说,还是很值得推荐使用框架的。

毕竟大家肯定不想从头开始整理这一套服务模板,集成常用功能模块,整理目录规范、代码规范吗,梳理标准的开发模式等等。

而且还有一些工程化的能力,比如支持 TypeScript,支持 ESModule 的配置,CI/CD,性能问题排查等等,也比较花费时间去配置。

Node.js 常用框架概览 

1. Express.js

Express.js 应该是大家听过最多的框架了,它确实也是一个简洁而灵活的 Node.js Web 应用程序框架,为 Web 和移动应用程序提供了一组强大的功能。

本质上,它是一系列中间件函数的集合,可以轻松地处理路由、请求和响应。

Express.js 的核心特性包括路由、中间件系统、模板引擎支持和静态文件服务。它的灵活性使其成为构建各种规模 Web 应用程序的理想选择。

它的核心概念有:

  • 路由:定义应用程序如何响应客户端请求的 URL 和 HTTP 方法。
  • 中间件:处理请求和响应的函数,可以执行各种任务,例如日志记录、身份验证和数据解析。
  • 模板引擎:允许你动态生成 HTML 页面。

再说下优缺点。

  • 优势:

    • 易于学习和使用
    • 庞大的社区和丰富的插件生态系统
    • 灵活性高,适用于各种规模的应用程序
  • 劣势:

    • 缺乏内置的架构,需要自行组织代码
    • 随着应用程序规模的增长,代码可能变得难以维护

2. Koa

Koa.js 是由 Express.js 原班人马开发的下一代 Node.js Web 框架。它旨在提供一个更小、更具表现力的基础,用于构建 Web 应用程序和 API。

Koa.js 利用 async/await 特性,使异步编程更加简洁和优雅。它还提供了一个强大的中间件系统,允许你以更灵活的方式处理请求和响应。比如我们在面试中就经常会问到 Koa 的洋葱模型。

它的核心概念就两个:

  • 上下文 (Context): 封装了 HTTP 请求和响应的对象,提供了方便的 API。
  • 中间件: 以级联方式执行的函数,可以访问和修改上下文对象。

再说下优缺点。

  • 优势:

    • 代码简洁,易于阅读和维护
    • 强大的错误处理机制
    • 高性能
  • 劣势:

    • 生态系统相对较小
    • 学习曲线稍陡峭

3. Nest.js

Nest.js 是一个用于构建高效且可伸缩的 Node.js 服务端应用程序的渐进式框架。它使用 TypeScript 构建,并结合了面向对象编程、函数式编程和函数响应式编程的元素。

Nest.js 提供了一个模块化的架构,允许你将应用程序分解为更小的、可重用的组件。它还提供了强大的依赖注入系统,简化了组件之间的依赖管理。

它的核心概念有:

  • 模块 (Modules): 组织代码的逻辑单元。
  • 控制器 (Controllers): 处理客户端请求的类。
  • 服务 (Services): 封装业务逻辑的类。
  • 依赖注入 (Dependency Injection): 管理组件之间依赖关系的设计模式。

再说下优缺点。

  • 优势:

    • 架构清晰,代码可维护性高
    • 强大的类型检查和代码提示
    • 丰富的特性和工具
  • 劣势:

    • 学习曲线较陡峭
    • 项目结构相对复杂

4. Midway.js

Midway.js 是阿里巴巴开源的 Node.js 全栈应用框架。它支持传统的 MVC 模式,也支持 Serverless 架构。

它提供了强大的依赖注入能力,并且拥有丰富的组件,比如:配置管理,日志管理,任务管理等等。

核心概念有:

  • 组件(Components): 可复用的功能模块。
  • 依赖注入(Dependency Injection): 管理组件之间依赖关系的设计模式。
  • AOP(Aspect-Oriented Programming): 面向切面编程,允许你将横切关注点与业务逻辑分离。

这里面可以使用一些装饰器,简化我们的开发。

比如 router 的定义:

import { Controller, Get } from'@midwayjs/core';

@Controller('/')
exportclass WeatherController {
// 这里是装饰器,定义一个路由
  @Get('/weather')
async getWeatherInfo(): Promise<string> {
    // 这里是 http 的返回,可以直接返回字符串,数字,JSON,Buffer 等
    return'Hello Weather!';
  }
}

来看看优缺点。

  • 优势:

    • 阿里巴巴出品,质量有保障。
    • 组件丰富,开箱即用。
    • 全栈能力,前后端都能支持。
  • 劣势:

    • 国内社区为主,国际影响力稍弱。
    • 学习资料相对少一些。

5. Fastify

Fastify 是一个专注于提供最佳性能的 Web 框架。它旨在尽可能快地处理 HTTP 请求和响应。

Fastify 使用 JSON Schema 进行数据验证,并提供了一个强大的插件系统,允许你扩展框架的功能。

核心概念:

  • 插件 (Plugins): 扩展框架功能的模块。
  • JSON Schema: 用于验证 JSON 数据的格式。

JSON Schema 使用起来确实也很简单:

import Fastify from'fastify'
const fastify = Fastify({
loggertrue
})

fastify.route({
method'GET',
url'/',
schema: {
    // request needs to have a querystring with a `name` parameter
    querystring: {
      type'object',
      properties: {
          name: { type'string'}
      },
      required: ['name'],
    },
    // the response needs to be an object with an `hello` property of type 'string'
    response: {
      200: {
        type'object',
        properties: {
          hello: { type'string' }
        }
      }
    }
  },
// this function is executed for every request before the handler is executed
preHandlerasync (request, reply) => {
    // E.g. check authentication
  },
handlerasync (request, reply) => {
    return { hello'world' }
  }
})

try {
await fastify.listen({ port3000 })
catch (err) {
  fastify.log.error(err)
  process.exit(1)
}

来看看优缺点。

  • 优势:

    • 极高的性能
    • 强大的插件系统
    • 良好的typescript支持
  • 劣势:

    • 生态系统相对较小
    • 学习资源较少

6. Sails.js

Sails.js 是一个基于 MVC 架构的 Node.js Web 框架。它旨在模仿 Ruby on Rails 的易用性,并提供自动生成的 API 和 WebSocket 支持。

Sails.js 遵循“约定优于配置”的原则,简化了开发过程。

核心概念:

  • 模型 (Models): 表示应用程序中的数据。
  • 视图 (Views): 定义应用程序的用户界面。
  • 控制器 (Controllers): 处理用户请求和更新模型。

来看看优缺点。

  • 优势:

    • 快速上手
    • 自动生成 API
    • 内置WebSocket支持
  • 劣势:

    • 过于依赖 MVC 架构
    • 灵活性稍差

7. Hapi.js

Hapi.js 是一个用于构建应用程序和服务的功能丰富的配置驱动框架。它强调配置和插件,适用于构建复杂的 API。

Hapi.js 提供了强大的验证和错误处理机制,确保应用程序的稳定性和安全性。

核心概念:

  • 服务器 (Server): 应用程序的入口点。
  • 路由 (Routes): 定义应用程序如何响应客户端请求。
  • 插件 (Plugins): 扩展框架功能的模块。

创建一个服务也很简单:

'use strict';

const Hapi = require('@hapi/hapi');

const init = async () => {

    const server = Hapi.server({
        port3000,
        host'localhost'
    });

    await server.start();
    console.log('Server running on %s', server.info.uri);
};

process.on('unhandledRejection', (err) => {

    console.log(err);
    process.exit(1);
});

init();

来看看优缺点。

  • 优势:

    • 配置管理方便
    • 插件丰富
    • 错误处理严格
  • 劣势:

    • 学习曲线较陡峭
    • 配置相对复杂

8. LoopBack

LoopBack 是一个高度可扩展的 Node.js 框架,用于快速创建 API。它提供了强大的数据建模和 API 探索工具。

LoopBack 支持多种数据源,包括关系型数据库、NoSQL 数据库和 REST API。

核心概念:

  • 模型 (Models): 表示应用程序中的数据。
  • 数据源 (Data Sources): 连接到不同类型数据库的组件。
  • API 探索器 (API Explorer): 自动生成的 API 文档和测试工具。

来看看优缺点。

  • 优势:

    • API 构建强大
    • 数据模型支持丰富
    • 自动生成文档
  • 劣势:

    • 相对重量级
    • 学习成本较高

9. Egg.js

这个大家应该也很熟悉。Egg.js 是阿里巴巴开源的企业级 Node.js Web 框架,基于 Koa.js。它遵循“约定优于配置”的原则,并提供了强大的插件机制。

Egg.js 旨在提高团队协作效率和应用程序的稳定性。

核心概念:

  • 约定优于配置: 遵循一套预定义的规则,减少配置工作。
  • 插件 (Plugins): 可扩展框架功能的独立模块。
  • 中间件 (Middleware): 处理 HTTP 请求和响应的函数。

来看看优缺点。

  • 优势:

    • 稳定可靠
    • 强大的插件机制
    • 适合团队协作
  • 劣势:

    • 约定较多,灵活性稍差
    • 学习成本相对较高

不同框架对比

最后再来做下汇总:

框架
官网
仓库地址
优点
缺点
使用场景
Star 数
Express.js
expressjs.com
github.com/expressjs/express
易于上手,社区庞大,生态丰富
缺乏内置架构,需要自行组织代码
小型到大型 Web 应用和 API
66.5k+
Koa.js
koajs.com
github.com/koajs/koa
代码简洁,错误处理优秀,中间件机制优雅
学习曲线稍陡峭,生态不如 Express.js 丰富
注重性能和简洁性的 Web 应用和 API
35.4k+
Nest.js
nestjs.com
github.com/nestjs/nest
架构清晰,代码可维护性高,适合大型项目
学习成本较高,项目结构相对复杂
大型企业级应用
69.9k+
Midway.js
midwayjs.org
github.com/midwayjs/midway
阿里巴巴出品,稳定性高,组件丰富
国内社区为主,国际影响力相对较小
全栈应用、微服务
7.5k+
Fastify
fastify.io
github.com/fastify/fastify
性能极佳,插件系统强大,JSON Schema 支持
生态相对较小,学习资源较少
高性能 API 和 Web 服务
33.3k+
Sails.js
sailsjs.com
github.com/balderdashy/sails
快速上手,自动生成 API,WebSocket 支持
过于依赖 MVC 架构,灵活性稍差
传统 Web 应用和 API
22.9k+
Hapi.js
hapijs.com
github.com/hapijs/hapi
配置管理方便,插件丰富,错误处理严格
学习曲线较陡峭,配置相对复杂
需要严格控制和配置的 API 和 Web 服务
14.7k+
LoopBack
loopback.io
github.com/loopbackio/loopback-next
API 构建强大,数据模型支持丰富,自动生成文档
相对重量级,学习成本较高
复杂 API 和微服务
5k+
Egg.js
eggjs.org
github.com/eggjs/egg
稳定可靠,插件机制完善,适合团队协作
约定较多,灵活性稍差,学习成本相对较高
大型、企业级的 Web 应用和 API
18.9k+

选择建议

最后再附上 Gemini 给出的框架选择建议:

  • 初学者或小型项目:Express.js
  • 追求性能和简洁:Koa.js
  • 大型企业级应用:Nest.js
  • 全栈项目,中国开发者:Midway.js
  • 高性能API:Fastify
  • 熟悉MVC:Sails.js
  • 需要严格配置:Hapi.js
  • API构建:Loopback
  • 企业级项目,团队协作:Egg.js

最后 

还没有使用过我们刷题网站(https://fe.ecool.fun/)或者刷题小程序的同学,如果近期准备或者正在找工作,千万不要错过,题库主打无广告和更新快哦~。

老规矩,也给我们团队的辅导服务打个广告。