关于在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 。必要时可以创建更多类型名,但必须注意,不要创建太多

符号名与文件名

  • 坚持为所有东西使用一致的命名约定,以它们所代表的东西命名
  • 坚持 使用大写驼峰命名法来命名类
  • 坚持匹配符号名与它所在的文件名
  • 坚持在符号名后面追加约定的类型后缀 (例如 componentDirectiveModulePipeService)
  • 坚持 在文件名后面追加约定的类型后缀(例如.component.ts.directive.ts .module.ts.pipe.ts.service.ts
  • 坚持 使用 中线命名法(dashed-case) 或叫 烤串命名法 kebab-case) 来命名组件的元素选择器

服务名&管道名

  • 坚持使用一致的规则命名服务,以它们的特性来命名
  • 坚持 为服务的类名加上 service 后缀。例如,获取数据或英雄列表的服务应该命名为 DataServiceHeroservice
  • 坚持 为所有管道使用一致的命名约定,用它们的特性来命名。管道类名应该使用 UpperCamelCase (类名的通用约定),而相应的 name 字符串应该使用lowerCamelCase。name字符串中不应该使用中线("中线格式"或"烤串格式")。例如:ellipsis.pipe.tsinit-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中会对功能进行划分建不同的文件夹: apicoredynamodb-stream image-resizer在核心模块中,按照功能模块进划分,与之相关的entity、service放置在同一文件夹中
  • 抽离公共配置到 shared 文件夹: 常量、自定义的装饰器、统一错误处理、过滤器、生成器、守卫、日志服务

项目三

技术栈:使用NestJS的Blog/CMS,RESTful API服务端应用

项目地址:surmon-china/nodepress 特点:

  • 项目文档及相关的资源在根目录
  • srcmodules会对功能进行划分建不同的文件夹
  • 单个功能文件夹中,会包括一个完整CURD的相关文件(model/controller/module/service)
  • 把公共的代码(按照nestjs逻辑分层) 拆成单独的文件 夹guardsfilters decoratorsinterceptorsinterfaceserrors

项目四

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

特点:

  • 项目文档及相关的资源在根目录,包括 typingstestbin
  • src中会对功能进行划分建不同的文件夹
  • 抽离公共代码到common文件夹,配置文件放在config文件夹,实体类放置在entity
  • 鉴权相关的逻辑放在auth 把同类的guardsfiltersdecoratorsinterceptorsinterfaceserrors存放在common文件中

推荐库

如果你正在使用 PostgreSQL 或 MySQL 等关系数据库,那么你可以使用 Prisma ------ 下一代Node.jsTypeScriptGo 的数据库ORM

相关推荐
轻口味1 小时前
【每日学点鸿蒙知识】AVCodec、SmartPerf工具、web组件加载、监听键盘的显示隐藏、Asset Store Kit
前端·华为·harmonyos
alikami1 小时前
【若依】用 post 请求传 json 格式的数据下载文件
前端·javascript·json
吃杠碰小鸡2 小时前
lodash常用函数
前端·javascript
emoji1111112 小时前
前端对页面数据进行缓存
开发语言·前端·javascript
泰伦闲鱼2 小时前
nestjs:GET REQUEST 缓存问题
服务器·前端·缓存·node.js·nestjs
m0_748250032 小时前
Web 第一次作业 初探html 使用VSCode工具开发
前端·html
一个处女座的程序猿O(∩_∩)O2 小时前
vue3 如何使用 mounted
前端·javascript·vue.js
m0_748235952 小时前
web复习(三)
前端
AiFlutter2 小时前
Flutter-底部分享弹窗(showModalBottomSheet)
java·前端·flutter
麦兜*2 小时前
轮播图带详情插件、uniApp插件
前端·javascript·uni-app·vue