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 runnin

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

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

而且还有一些工程化的能力,比如支持 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 {

// 这里是 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({

logger: true

})

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

preHandler: async (request, reply) => {

// E.g. check authentication

},

handler: async (request, reply) => {

return { hello: 'world' }

}

})

try {

await fastify.listen({ port: 3000 })

} catch (err) {

fastify.log.error(err)

process.exit(1)

}

来看看优缺点。

优势:

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

劣势:

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

Sails.js

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

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

核心概念:

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

来看看优缺点。

优势:

快速上手自动生成 API内置WebSocket支持

劣势:

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

Hapi.js

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

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

核心概念:

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

创建一个服务也很简单:

'use strict';

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

const init = async () => {

const server = Hapi.server({

port: 3000,

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 构建强大数据模型支持丰富自动生成文档

劣势:

相对重量级学习成本较高

Egg.js

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

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

核心概念:

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

来看看优缺点。

优势:

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

劣势:

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

选择建议

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

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

Node相关面试题推荐

1.说说 express middleware(中间件) 的工作原理 2.怎么在 koa 中,进行中间件的异常处理? 3.PM2 部署 nodejs 有哪些优势? 4.说说你对 koa 洋葱模型的理解 5.koa和express有哪些不同?

最后

关注我,每天分享前端面试相关面试题和最新前端技术。