最近在开发一个 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有哪些不同?
最后
关注我,每天分享前端面试相关面试题和最新前端技术。