NestJS:Node.js最受欢迎的框架之一
以前开发小程序api使用过Express.js、Koa.js等框架,最近想用NestJS重构自己的几个小程序后台,所以从零开始学习NestJS框架。
目前Node.js 最受欢迎的框架通常指的是那些为了简化 Node.js 应用程序开发而创建的库或工具。以下是一些最受欢迎的框架:
- Express.js - 这是一个简化 Node.js 应用程序开发的非常流行的框架。它提供了一个轻量级的web应用程序服务器,可以快速地搭建一个web服务器。
- Koa.js - 是下一代的 Express.js 框架,使用了更现代的中间件API。
- Hapi.js - 另一个强大的 Node.js 框架,提供了丰富的功能和强大的插件系统。
- Nest.js - 是一个用于构建高效、可扩展的Node.js服务器端应用的框架。它使用了OOP(面向对象编程)的概念,并结合了函数式编程的模式。
下面我们主要介绍下NestJS
NestJS 具有架构设计合理、功能特性丰富、开发效率高、性能和可扩展性好等优势,是构建 Node.js 服务器端应用程序的理想选择
一、架构设计
1.模块化架构
- NestJS 采用模块化的架构设计,使得代码结构清晰、易于维护。每个模块可以专注于特定的业务功能,模块之间的依赖关系明确,方便开发人员进行代码组织和管理。
- 例如,一个电商应用可以分为用户模块、商品模块、订单模块等,每个模块都有自己的控制器、服务和实体,模块之间通过依赖注入进行交互。
2.面向对象编程(OOP)风格
- 借鉴了面向对象编程的思想,提供了类、接口、装饰器等特性,使得代码更加直观、易于理解和扩展。
- 例如,可以使用类来定义控制器、服务和实体,通过装饰器来添加元数据,提高代码的可读性和可维护性。 3.依赖注入
- 强大的依赖注入系统,使得模块之间的耦合度降低,提高了代码的可测试性和可维护性。开发人员可以轻松地替换模块的实现,而不影响其他部分的代码。
- 例如,可以通过依赖注入将数据库连接对象注入到服务中,使得服务可以方便地访问数据库,而不需要在服务内部硬编码数据库连接的细节。
二、功能特性
1.支持多种后端技术
- NestJS 可以与多种后端技术集成,如 TypeScript、Express.js、Fastify 等。这使得开发人员可以根据项目的需求选择合适的技术栈,提高开发效率。
- 例如,如果需要高性能的服务器,可以选择使用 Fastify;如果需要更好的类型安全和开发体验,可以选择使用 TypeScript。
2.内置的功能模块
- 提供了许多内置的功能模块,如路由、中间件、验证、异常处理等,减少了开发人员的工作量。这些模块经过精心设计和优化,具有良好的性能和稳定性。
- 例如,可以使用 NestJS 的路由模块来定义 API 路由,使用验证模块来对输入数据进行验证,使用异常处理模块来统一处理应用程序中的异常。
3.支持微服务架构
- NestJS 支持构建微服务架构,可以轻松地将应用程序拆分为多个独立的服务,每个服务可以独立部署和扩展。这使得应用程序具有更好的可扩展性和高可用性。
- 例如,可以使用 NestJS 的微服务模块来构建一个分布式的电商系统,将用户服务、商品服务、订单服务等拆分为独立的微服务,通过消息队列进行通信。
三、开发效率
1.代码生成器
- NestJS 提供了代码生成器,可以快速生成模块、控制器、服务等代码结构,减少了手动编写代码的工作量。开发人员可以通过命令行工具或集成开发环境(IDE)插件来使用代码生成器。
- 例如,可以使用
nest generate module user
命令来生成一个用户模块,包括控制器、服务和实体等文件。
2.良好的文档和社区支持
- NestJS 拥有详细的文档和活跃的社区,开发人员可以方便地获取帮助和解决问题。文档内容丰富,包括教程、示例代码、API 参考等,方便开发人员快速上手。
- 社区活跃,有许多开发者分享经验和解决方案,遇到问题时可以在社区中寻求帮助。
3.与前端框架集成方便
- NestJS 可以与各种前端框架(如 Angular、React、Vue.js 等)集成,实现前后端分离的开发模式。通过使用 API 网关或代理服务器,可以方便地将前端请求转发到后端服务。
- 例如,可以使用 NestJS 构建一个 API 网关,将前端的请求转发到不同的微服务,实现统一的入口和路由管理。
四、性能和可扩展性
1.高性能
- NestJS 基于 Node.js 运行时,具有良好的性能表现。它可以处理大量的并发请求,并且响应速度快。此外,NestJS 还可以通过使用缓存、异步编程等技术来进一步提高性能。
- 例如,可以使用缓存中间件来缓存频繁访问的数据,减少数据库查询的次数,提高响应速度。
2.可扩展性
- 由于采用了模块化架构和依赖注入,NestJS 具有良好的可扩展性。可以轻松地添加新的功能模块、扩展现有模块的功能,或者替换模块的实现。
- 例如,如果需要添加一个新的支付功能,可以创建一个支付模块,并将其集成到现有的电商系统中。
NestJS的第一个接口 Hello World!
代码语言:bash复制npm i -g @nestjs/cli // 全局安装Nest
nest new project-name // 创建项目
我们选择yarn 初始化项目
本地环境yarn 1.22.22、node 21.7.2
代码语言:typescript复制 import { Controller, Get } from '@nestjs/common';
@Controller()
export class AppController {
@Get()
getHello(): string {
return 'Hello World!';
}
}
yarn start
app.module.ts
代码语言:typescript复制import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
app.service.ts
代码语言:typescript复制import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
app.controller.ts
代码语言:typescript复制import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
}
main.ts
代码语言:typescript复制declare const module: any;
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3001);
if (module.hot) {
module.hot.accept();
module.hot.dispose(() => app.close());
}
}
bootstrap();
NestJS热更新
使用 NestJS 内置的开发服务器(需要安装 @nestjs/cli
******)**
1.使用 ts-node-dev
- 安装
ts-node-dev
:
npm install -D ts-node-dev
- 修改启动脚本:
在 `package.json` 文件中,将启动脚本修改为使用 `ts-node-dev`。
代码语言:json复制"scripts": { "start": "ts-node-dev --respawn --transpile-only src/main.ts" }
2. run-script-webpack-plugin
代码语言:bash复制 yarn add webpack-node-externals run-script-webpack-plugin webpack
代码语言:json复制"start:dev": "webpack --config webpack.config.js --watch",
webpack.config.js
代码语言:javascript复制const webpack = require('webpack');
const path = require('path');
const nodeExternals = require('webpack-node-externals');
const { RunScriptWebpackPlugin } = require('run-script-webpack-plugin');
module.exports = {
entry: ['webpack/hot/poll?100', './src/main.ts'],
target: 'node',
externals: [
nodeExternals({
allowlist: ['webpack/hot/poll?100'],
}),
],
module: {
rules: [
{
test: /.tsx?$/,
use: 'ts-loader',
exclude: /node_modules/,
},
],
},
mode: 'development',
resolve: {
extensions: ['.tsx', '.ts', '.js'],
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
new RunScriptWebpackPlugin({ name: 'server.js' }),
],
output: {
path: path.join(__dirname, 'dist'),
filename: 'server.js',
},
};webpack.config.js
3.启动开发服务器 --watch
在项目根目录下运行以下命令启动开发服务器:
代码语言:bash复制nest start --watch
这个命令会启动一个开发服务器,并监视文件的变化。当文件发生变化时,服务器会自动重新加载。
这些方法可以帮助你在开发过程中实现热更新,提高开发效率。根据你的项目需求和偏好选择适合的方法。
开始写这篇文章的时候,我已经把自己的小程序后台koa项目改造成了NestJS。后续还会写NestJS使用ORM、如何在NestJS中添加日志、jwt token处理、全局错误处理、接口参数校验、redis缓存、图片上传等等