大家好,我是刘布斯。
最近在开发一个 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,性能问题排查等等,也比较花费时间去配置。
Express.js 应该是大家听过最多的框架了,它确实也是一个简洁而灵活的 Node.js Web 应用程序框架,为 Web 和移动应用程序提供了一组强大的功能。
本质上,它是一系列中间件函数的集合,可以轻松地处理路由、请求和响应。
Express.js 的核心特性包括路由、中间件系统、模板引擎支持和静态文件服务。它的灵活性使其成为构建各种规模 Web 应用程序的理想选择。
它的核心概念有:
再说下优缺点。
优势:
劣势:
Koa.js 是由 Express.js 原班人马开发的下一代 Node.js Web 框架。它旨在提供一个更小、更具表现力的基础,用于构建 Web 应用程序和 API。
Koa.js 利用 async/await 特性,使异步编程更加简洁和优雅。它还提供了一个强大的中间件系统,允许你以更灵活的方式处理请求和响应。比如我们在面试中就经常会问到 Koa 的洋葱模型。
它的核心概念就两个:
再说下优缺点。
优势:
劣势:
Nest.js 是一个用于构建高效且可伸缩的 Node.js 服务端应用程序的渐进式框架。它使用 TypeScript 构建,并结合了面向对象编程、函数式编程和函数响应式编程的元素。
Nest.js 提供了一个模块化的架构,允许你将应用程序分解为更小的、可重用的组件。它还提供了强大的依赖注入系统,简化了组件之间的依赖管理。
它的核心概念有:
再说下优缺点。
优势:
劣势:
Midway.js 是阿里巴巴开源的 Node.js 全栈应用框架。它支持传统的 MVC 模式,也支持 Serverless 架构。
它提供了强大的依赖注入能力,并且拥有丰富的组件,比如:配置管理,日志管理,任务管理等等。
核心概念有:
这里面可以使用一些装饰器,简化我们的开发。
比如 router 的定义:
import { Controller, Get } from'@midwayjs/core';
@Controller('/')
exportclass WeatherController {
// 这里是装饰器,定义一个路由
@Get('/weather')
async getWeatherInfo(): Promise<string> {
// 这里是 http 的返回,可以直接返回字符串,数字,JSON,Buffer 等
return'Hello Weather!';
}
}
来看看优缺点。
优势:
劣势:
Fastify 是一个专注于提供最佳性能的 Web 框架。它旨在尽可能快地处理 HTTP 请求和响应。
Fastify 使用 JSON Schema 进行数据验证,并提供了一个强大的插件系统,允许你扩展框架的功能。
核心概念:
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)
}
来看看优缺点。
优势:
劣势:
Sails.js 是一个基于 MVC 架构的 Node.js Web 框架。它旨在模仿 Ruby on Rails 的易用性,并提供自动生成的 API 和 WebSocket 支持。
Sails.js 遵循“约定优于配置”的原则,简化了开发过程。
核心概念:
来看看优缺点。
优势:
劣势:
Hapi.js 是一个用于构建应用程序和服务的功能丰富的配置驱动框架。它强调配置和插件,适用于构建复杂的 API。
Hapi.js 提供了强大的验证和错误处理机制,确保应用程序的稳定性和安全性。
核心概念:
创建一个服务也很简单:
'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();
来看看优缺点。
优势:
劣势:
LoopBack 是一个高度可扩展的 Node.js 框架,用于快速创建 API。它提供了强大的数据建模和 API 探索工具。
LoopBack 支持多种数据源,包括关系型数据库、NoSQL 数据库和 REST API。
核心概念:
来看看优缺点。
优势:
劣势:
这个大家应该也很熟悉。Egg.js 是阿里巴巴开源的企业级 Node.js Web 框架,基于 Koa.js。它遵循“约定优于配置”的原则,并提供了强大的插件机制。
Egg.js 旨在提高团队协作效率和应用程序的稳定性。
核心概念:
来看看优缺点。
优势:
劣势:
最后再来做下汇总:
最后再附上 Gemini
给出的框架选择建议:
还没有使用过我们刷题网站(https://fe.ecool.fun/)或者刷题小程序的同学,如果近期准备或者正在找工作,千万不要错过,题库主打无广告和更新快哦~。
老规矩,也给我们团队的辅导服务打个广告。