这个系列前面的文章已经将 Nest 的核心思想以及核心概念过了一遍,并举例了一些使用场景。相信看过这些介绍后,应该可以上手使用 Nest 开发项目。
指路之前的文章:
从这章开始,我们将更进阶的了解 Nest 的实现思想,对其源码进行分析。
获取源码
首先,从 github 找到 Nest 的源码,git clone 到本地。
目录结构
根目录
根目录结构大致如下:
go
nestjs/
├── benchmarks/
├── packages/
├── sample/
├── integration/
├── tools/
├── scripts/
├── package.json
└── tsconfig.json
其中每个子目录的分工为:
benchmarks
: 性能测试相关代码integration
: 集成测试相关代码packages
: 核心代码,每个子目录对应一个核心模块包sample
: 示例项目代码scripts
: 发布脚本、CI 工具脚本等tools
: 构建和性能测试相关的工具函数tsconfig.json
: Typescript 配置
packages 目录
下面来看下包含核心源码的 packages 目录:
lua
packages/
├── common/
├── core/
├── microservices/
├── platform-express/
├── platform-fastify/
|------ platform-socket.io/
|------ platform-ws/
|------ websockets/
├── testing/
└── ...
它的每个子目录都是一个模块,可以单独发布到 npm,比如 @nestjs/common
、@nestjs/core
。
common
erlang
common/
├── decorator/
├── exceptions/
├── pipes/
├── enums/
├── utils/
└── ...
包含全平台通用的公共模块,比如:
decorator
: 内置装饰器,比如模块装饰器@Module
、控制器装饰器@Controller
、依赖注入装饰器@Injectable
,@UsePipes
、@UseGuards
等,以及 http 相关@Get
、@Post
等等exceptions
: 内置异常处理类,比如HttpException
、NotFoundException
、ForbiddenException
等pipes
: 内置管道,比如:ParseIntPipe
、ValidationPipe
等enums
: 枚举类,比如 http 状态码等utils
: 工具类- ...
core
整个框架最核心逻辑,包含依赖注入系统、模块系统、反射机制、路由等。
dart
core/
├── guards/
├── interceptors/
├── middleware/
├── services/
├── router/
├── injector/
├── nest-application.ts
├── nest-factory.ts
├── scanner.ts
├── ...
guards
: 守卫interceptors
: 拦截器middleware
: 中间件services
: 服务,比如 Reflector 类router
: 控制器路由注册逻辑injector
: 依赖注入相关逻辑,包含 NestContainer(IoC 容器)、Module 等定义nest-application.ts
: NestApplication 类nest-factory.ts
: NestFactory 类scanner.ts
: 模块依赖关系扫描
microservices
微服务模块
platform-express / platform-fastify
- 用于在 nest 中集成 express、fastify 框架。
- 默认使用 express 基础框架,但 nest 不依赖其中任何一个。
- Fastify 是一个更快速、低开销的 Web 框架,对性能要求高的应用场景会使用到它。
platform-socket.io / platform-ws / websockets
WebSocket 支持模块
testing
提供测试工具,如 Test.createTestingModule()
。
总结
本章介绍了 Nest 源码的目录结构,代码按照功能模块组织,遵循单一职责原则。接下来我们对源码的分析会集中在 packages/common
和 packages/core
目录中。