Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,由 Ryan Dahl 在 2009 年创建。它允许 JavaScript 代码在服务器端运行,开启了 JavaScript 的全栈开发时代。Node.js 以其非阻塞 I/O 和事件驱动架构而闻名,这使得它在处理大量并发连接时非常高效。很多大厂也是用 Node.js 搭建自己的后端服务。

下面推荐 6 款热门的 Node.js 服务端框架,任意一款都值得信任。

Express.js

express.js
Express.js

Express.js 是 Node.js 最久远的后端框架之一,主要用于创建 Web 应用程序和 RESTful API。Express 核心功能最小化,可以通过使用 Express 中间件模块来增强。截至 2024/12 ,Express 已经出到了 5.x 版本,还在迭代,实属不易。

搭建一个简单的 Express 服务,使用 app.use 中间件时间日志记录。

// 引入 express 模块
const express = require("express");
// 创建 express 应用
const app = express();
// 创建 HTTP 服务的端口
const port = 3000;

// 简单的中间件,用于记录请求信息
app.use((req, res, next) => {
  console.log(`${req.method} request for ${req.url}`);
  // 调用 next() 函数将控制权传递给下一个中间件或路由处理器
  next();
});

// 定义一个路由,响应 GET 请求
app.get("/", (req, res) => {
  res.send("Hello, Kelen.cc");
});

// 启动服务器
app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`);
});

Koa.js

Koa.js
Koa.js

Koa.js 是一个由 Express.js 原班人马打造的更小、更强大、更富有表现力的 web 框架。为 Web 应用和 API 开发提供更优雅的中间件堆栈,同时移除了回调函数(callback)地狱的问题,通过使用 ES6 的 asyncawait 语法来简化异步操作。

Koa 的中间件系统采用了“洋葱模型”,每个中间件都可以访问请求和响应对象,并可以选择继续传递给下一个中间件,或者提前结束请求。这种机制使得处理复杂的业务逻辑变得更加容易,同时也便于维护和扩展。

搭建一个 Koa 服务也是很简单,代码示例如下:

// app.js
const Koa = require("koa");
const app = new Koa();

// 使用中间件
app.use(async (ctx) => {
  ctx.body = "Hello, Kelen.cc!";
});

// 监听端口
app.listen(3000, () => {
  console.log("Server is running on http://localhost:3000");
});

NestJS

NestJS
NestJS

NestJS 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的框架。结合了 OOP(面向对象编程)、FP(函数式编程)和 FRP(函数式响应式编程)等多种编程范式,支持 TypeScript 。

这些编程思想,对于刚入门前端的小伙伴可能不是太友好,以下是一个简单的例子:

  • 创建一个 controller
// src/app.controller.ts
import { Controller, Get } from "@nestjs/common";

@Controller()
export class AppController {
  @Get()
  getHello(): string {
    return "Hello, Kelen.cc";
  }
}
  • app.module.ts 文件定义了应用程序的根模块,这是 NestJS 应用程序的核心。
// src/app.module.ts
import { Module } from "@nestjs/common";
import { AppController } from "./app.controller";

@Module({
  imports: [],
  controllers: [AppController],
  providers: [],
})
export class AppModule {}
  • 启动服务
// src/main.ts
import { NestFactory } from "@nestjs/core";
import { AppModule } from "./app.module";

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000); // 监听 3000 端口
}
bootstrap();

可以看出 NestJs 创建服务相对还是比较麻烦,新人上手可能比较困难,不过 NestJs 在模块化、依赖注入、面向对象编程、异步处理、错误处理、实时通信等方面提供了更多高级功能,适合构建复杂的企业级应用。

Hapi

hapi
hapi

Hapi 是一个用于构建 RESTful API 的 Node.js 框架。由 Walmart Labs 开发和维护,以其灵活性、模块化和强大的插件生态系统而闻名。Hapi 的设计理念是让开发者专注于编写业务逻辑,而不必担心底层的基础设施。适合需要高度安全性可靠性的企业级应用开发。

一个简单的例子,启动一个 hapi 服务并且使用静态文件服务插件。

const Hapi = require("@hapi/hapi");
const Inert = require("@hapi/inert");

async function startServer() {
  const server = Hapi.server({
    port: 3000,
    host: "localhost",
  });

  // 注册 inert 插件
  await server.register(Inert);

  // 配置静态文件服务
  server.route({
    method: "GET",
    path: "/{param*}",
    handler: {
      directory: {
        path: "./public", // 指定静态文件目录
      },
    },
  });

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

process.on("unhandledRejection", (err) => {
  console.error(err);
  process.exit(1);
});

startServer();

Fastify

Fastify
Fastify

Fastify 高度专注于以最少的开销和强大的插件架构提供最佳的开发人员体验。它受到 Hapi 和 Express 的启发,自称是最快的 Web 框架之一,每秒可以处理多达 3 万个请求。提供了 hooks, plugins and decorators 等特性,方便扩展和定制。

我的博客就是从 Express 重构成 Fastify 的,总体花了两个周末的时间,大概 4 天,使用 Cursor 来重构的。史上最强AI编辑器Cursor它来了,还不快用起来

启动一个简单的 Fastify 的代码:

// Import the framework and instantiate it
import Fastify from "fastify";
const fastify = Fastify({
  logger: true,
});

// Declare a route
fastify.get("/", async function handler(request, reply) {
  return { hello: "world" };
});

// Run the server!
try {
  await fastify.listen({ port: 3000 });
} catch (err) {
  fastify.log.error(err);
  process.exit(1);
}

AdonisJS

AdonisJS
AdonisJS

AdonisJS 是一个用于构建高效、可扩展的 Node.js 应用程序的全栈框架,特别适合开发 Web 应用和 API。它受到了 Laravel(PHP 框架)的启发,借鉴了许多 Laravel 的设计理念,内置 ORM、强大的路由系统、身份验证机制以及丰富的插件生态系统。

这个框架没有实践过,看官网也没有一个简单的 Demo,就不举例子了,有兴趣的朋友可以自行照着官网跑一下例子!

如果有更牛皮的 Nodejs 框架,欢迎评论区讨论!