前言:什么是NestJS?
Nest 是一个用于构建高效,可扩展的 Node.js 服务器端应用程序的框架。它使用渐进式 JavaScript,内置并完全支持 TypeScript(但仍然允许开发人员使用纯 JavaScript 编写代码)并结合了 OOP(面向对象编程),FP(函数式编程)和 FRP(函数式响应编程)的元素。
为什么用NestJS?
有许多良好的特性如:
- 控制器内方法的动态参数
- nest脚手架自动生成文件
- 构建高度可扩展且易于维护的应用程序
- 官方库支持完备
- 大型社区和支持系统
- IOC控制反转
- 模块内职责清晰、模块对外输出统一
...
NestJS是一个spring mvc风格的node框架,可以理解为nodejs版的spring
作者推荐
在官方的issues中,可以找到一些提示:Best scalable project structure · Issue #2249 · nestjs/nest (github.com) 这里有作者的回复:
markdown
- src
- core
- common
- middleware
- interceptors
- guards
- user
- interceptors (scoped interceptors)
- user.controller.ts
- user.model.ts
- store
- store.controller.ts
- store.model.ts
- 可以使用monorepo的方法一一在一个repo中创建两个项目,并在它们之间共享共同的东西,例如:库、包。(对于前端项目:vue3、element都是采用的这种架构模式。)
- 没有模块目录,按照功能进行划分
- 把通用/核心的东西归为单独的目录:common,比如:拦截器/守卫/管道
代码风格
总则
- 坚持每个文件只定义一样东西(例如服务或组件)
- 考虑把文件大小限制在400行代码以内
- 坚持定义简单函数
- 考虑限制在75行之内
命名
- 坚持所有符号使用一致的命名规则
- 坚持遵循同一个模式来描述符号的特性和类型
使用点和横杠来分隔文件名
- 坚持在描述性名字中,用横杠来分隔单词
- 坚持使用点来分隔描述性名字和类型
- 坚持遵循先描述组件特性,再描述它的类型的模式,对所有组件使用一致的类型命名规则。 推荐的模式为feature.type.ts
- 坚持 使用惯用的后缀来描述类型,包括
*.service
、*.component
、*.pipe
、.module
、.directive
。必要时可以创建更多类型名,但必须注意,不要创建太多
符号名与文件名
- 坚持为所有东西使用一致的命名约定,以它们所代表的东西命名
- 坚持 使用大写驼峰命名法来命名类
- 坚持匹配符号名与它所在的文件名
- 坚持在符号名后面追加约定的类型后缀 (例如
component
、Directive
、Module
、Pipe
、Service
) - 坚持 在文件名后面追加约定的类型后缀(例如
.component.ts
、.directive.ts
、.module.ts
、.pipe.ts
、.service.ts
- 坚持 使用 中线命名法(dashed-case) 或叫
烤串命名法 kebab-case)
来命名组件的元素选择器
服务名&管道名
- 坚持使用一致的规则命名服务,以它们的特性来命名
- 坚持 为服务的类名加上
service
后缀。例如,获取数据或英雄列表的服务应该命名为DataService
或Heroservice
- 坚持 为所有管道使用一致的命名约定,用它们的特性来命名。管道类名应该使用 UpperCamelCase (类名的通用约定),而相应的
name
字符串应该使用lowerCamelCase。name
字符串中不应该使用中线("中线格式"或"烤串格式")。例如:ellipsis.pipe.ts
和init-caps.pipe.ts
- 坚持在模块中只包含模块间的依赖关系,所有其它逻辑都应该放到服务中
- 坚持把可复用的逻辑放到服务中,保持组件简单,聚焦于它们预期目的
- 坚持在同一个注入器内,把服务当做单例使用,用它们来共享数据和功能
- 坚持创建封装在上下文中的单一职责的服务
- 坚持当服务成长到超出单一用途时,创建一个新服务
- 坚持把数据操作和与数据交互的逻辑重构到服务里
引导
- 坚持 把应用的引导程序和平台相关的逻辑放到名为
main.ts
的文件里 - 坚持在引导逻辑中包含错误处理代码
- 避免 把应用逻辑放在
main.t
s中,而应放在组件或服务里
参考项目
项目一
技术栈:Nest+sequelize-typescript+JWT+Jest+Swagger
项目地址:kentloog/nestjs-sequelize-typescript 特点:
- 项目文档及相关的资源在根目录
- 数据库及项目配置会放在根目录 (细节:数据库升级文件)
src
中会对功能进行划分建不同的文件夹users、posts- 单个功能文件夹中,会包括一个完整CURD的相关文件dto/controller/module/providers/service)
- 抽离公共配置到
shared
文件夹
项目二
技术栈:具有AWS Lambda,DynamoDB,DynamoDB Streams的完全无服务器生成应用程序
项目地址:International-Slackline-Association/Rankings-Backend 特点:
- 根目录中存放webpack、微服务配置+项目文档
src
中会对功能进行划分建不同的文件夹:api
、core
、dynamodb-stream
、image-resizer
在核心模块中,按照功能模块进划分,与之相关的entity、service放置在同一文件夹中- 抽离公共配置到
shared
文件夹: 常量、自定义的装饰器、统一错误处理、过滤器、生成器、守卫、日志服务
项目三
技术栈:使用NestJS的Blog/CMS,RESTful API服务端应用
项目地址:surmon-china/nodepress 特点:
- 项目文档及相关的资源在根目录
src
中modules
会对功能进行划分建不同的文件夹- 单个功能文件夹中,会包括一个完整CURD的相关文件(model/controller/module/service)
- 把公共的代码(按照nestjs逻辑分层) 拆成单独的文件 夹
guards
、filters
、decorators
、interceptors
、interfaces
、errors
项目四
技术栈:Nest+
项目地址:CatsMiaow/nestjs-project-structure 项目结构:
arduino
+-- bin // Custom tasks
+-- dist // Source build
+-- public // Static Files
+-- src
| +-- config // Environment Configuration
| +-- entity // TypeORM Entities
| +-- auth // Authentication
| +-- common // Global Nest Module
| | +-- constants // Constant value and Enum
| | +-- controllers // Nest Controllers
| | +-- decorators // Nest Decorators
| | +-- dto // DTO (Data Transfer Object) Schema, Validation
| | +-- filters // Nest Filters
| | +-- guards // Nest Guards
| | +-- interceptors // Nest Interceptors
| | +-- interfaces // TypeScript Interfaces
| | +-- middleware // Nest Middleware
| | +-- pipes // Nest Pipes
| | +-- providers // Nest Providers
| | +-- * // models, repositories, services...
| +-- shared // Shared Nest Modules
| +-- gql // GraphQL Structure
| +-- * // Other Nest Modules, non-global, same as common structure above
+-- test // Jest testing
+-- typings // Modules and global type definitions
如果是功能模块
sql
// Module structure
// Add folders according to module scale. If it's small, you don't need to add folders.
+-- src/greeter
| +-- * // folders
| +-- greeter.constant.ts
| +-- greeter.controller.ts
| +-- greeter.service.ts
| +-- greeter.module.ts
| +-- greeter.*.ts
| +-- index.ts
特点:
- 项目文档及相关的资源在根目录,包括
typings
、test
、bin
src
中会对功能进行划分建不同的文件夹- 抽离公共代码到
common
文件夹,配置文件放在config文件夹,实体类放置在entity
中 - 鉴权相关的逻辑放在
auth
把同类的guards
、filters
、decorators
、interceptors
、interfaces
、errors
存放在common文件中
推荐库
如果你正在使用 PostgreSQL 或 MySQL 等关系数据库,那么你可以使用 Prisma ------ 下一代Node.js
、TypeScript
、Go
的数据库ORM