关于在Nest的最佳实践

前言:什么是NestJS?

Nest 是一个用于构建高效,可扩展的 Node.js 服务器端应用程序的框架。它使用渐进式 JavaScript,内置并完全支持 TypeScript(但仍然允许开发人员使用纯 JavaScript 编写代码)并结合了 OOP(面向对象编程),FP(函数式编程)和 FRP(函数式响应编程)的元素。

为什么用NestJS?

有许多良好的特性如:

  1. 控制器内方法的动态参数
  2. nest脚手架自动生成文件
  3. 构建高度可扩展且易于维护的应用程序
  4. 官方库支持完备
  5. 大型社区和支持系统
  6. IOC控制反转
  7. 模块内职责清晰、模块对外输出统一
    ...
    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.ts中,而应放在组件或服务里

参考项目

项目一

技术栈: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

相关推荐
FungLeo9 小时前
成为全栈·React 管理后台篇·总复盘:从“接口能调通”到“后台值得使用”
前端·react.js·前端框架·项目复盘·成为全栈
Csvn10 小时前
并发模式:让渲染学会排队、插队和让路
前端
可乐鸡翅yeah_11 小时前
新手梳理:M3U8 线上问题,哪些是前端锅,哪些是后端锅
前端·ios·音视频·实时音视频·m3u8·音视频在线播放
Flynt11 小时前
Linear 用 1000 个 PR 换掉 styled-components,我写了 200 个按钮,把这笔账复现了一遍
前端·css·preact
JavaGuide12 小时前
NVIDIA 又开源了!这次给 AI Agent 加上权限管控
前端·后端
excel12 小时前
prisma 如何处理数据库竞态
前端·数据库·后端
莪_幻尘13 小时前
Skill 体检:30 个 Skill 全凭感觉?体检器先自曝了 8 个“假 0 分
前端·人工智能·llm
风骏时光牛马13 小时前
AI模型综合能力评测:性能、指令遵循与多场景实测对比
前端
Frag0ut13 小时前
Chrome与Chromium内核浏览器在Windows 11上的新特性全景解析
前端·chrome·windows·web安全·chromium·gemini ai·playready drm
hiahiahia12314 小时前
实现完整 Tool Dispatcher
开发语言·前端