道,侧重于根本性、指导性原则,代表事物的本源和规律。
common
- 切片组合思想(Fragment and Combination)
- 代码复用(Develop once, use everywhere)
路由(Router)
定义:
路由是指在应用中,根据特定的 URL 请求路径,将请求映射到相应的处理逻辑(例如控制器方法)。它是前后端通信的关键分,定义了应用程序 响应客户端请求的方式。
用途:
- 在前端:管理页面导航(如 React Router 或 Vue Router)。
- 在后端:处理 HTTP 请求,路由到对应的控制器(如 Express、NestJS 中的路由)。
相关概念:
- 动态路由: 根据路径参数动态匹配 URL(如 /user/:id)。
- 嵌套路由: 在一个路由中包含子路由(如 parent/child)。
- 路由守卫(Guard): 用于限制特定路由的访问权限。
中间件(Middleware)
定义:
中间件是程序中一个用于拦截和处理请求或响应的函数。它可以在请求到达路由处理器之前,或者响应返回客户端之前,添加通逻辑(如日志记 录、认证检查等)。
用途:
- 在 Express 中,定义请求处理的管道。
- 在 NestJS 中,中间件是特定于模块的。
相关概念:
- 请求管道: 请求在到达最终路由之前通过的中间件队列。
- 全局中间件: 应用程序中对所有请求生效的中间件。
- 错误处理中间件: 专门用于捕获和处理错误的中间件。
拦截器(Interceptor)
定义:
拦截器用于在处理请求或响应时,拦截并对其进行预处理或后处理。它通常用于修改数据、日志记录、缓存、转换等。
用途:
- 在 NestJS 中,拦截器用于扩展请求管道的功能,例如对响应进行数据格式化。
- 在前端(如 Axios 拦截器),用于在 HTTP 请求或响应时统一添加操作。
相关概念:
- 过滤器(Filter): 专门用于捕获异常或过滤特定数据。
- 钩子(Hooks): 用于在特定生命周期中执行操作。
装饰器(Decorator)
定义:
装饰器是一种特殊的函数,用于在类、方法、属性、参数等上动态添加元数据或功能。它是元编程的一部分。
用途:
-
在 TypeScript 中,装饰器用于添加类型信息或行为(如 @Component)。
-
在 NestJS 中,用于定义控制器、路由等(如 @Controller, @Get, @Inject)。
相关概念:
-
元数据(Metadata): 描述对象信息的数据(如 Reflect-metadata)。
-
注解(Annotations): 装饰器的一种具体应用,常见于 Java 和 Spring。
依赖注入(Dependency Injection,DI)
定义:
依赖注入是一种设计模式,指将对象的依赖(例如服务或配置)从外部传递到对象中,而不是对象自己创建依赖。
用途:
- 提高代码可测试性和模块化。
- 在 NestJS 或 Angular 中,通过构造函数注入依赖(如服务)。
相关概念:
- 服务容器(Service Container): 管理依赖关系的核心机制。
- 注入器(Injector): 提供依赖实例的工具。
控制反转(Inversion of Control,IoC)
定义:
控制反转是一种设计原则,将对象的创建和管理的控制权从代码中移交给框架或容器。它是依赖注入的基础。
用途:
- 在 NestJS 中,通过 IoC 容器管理服务的实例化。
- 提供松耦合的设计。
相关概念:
- 工厂模式(Factory Pattern): 通过工厂方法创建对象。
- DI 容器: IoC 的核心工具,用于自动注入依赖。
关注点分离(Separation of Concerns,SoC)
定义:
关注点分离是一种设计原则,旨在将系统的不同职责分离到独立模块或层次中,以便更容易维护和扩展。
用途:
- 将前端和后端逻辑分开。
- 在 MVC(Model-View-Controller)架构中分离模型、视图和控制器。
相关概念:
- 单一职责原则(SRP): 每个模块或类只负责一个职责。
- 模块化设计: 将系统划分为多个独立模块。
- 分层架构: 例如三层架构(表示层、业务逻辑层、数据层)。
模块化(Modularity)
定义:
模块化是一种软件设计技术,将系统拆分为多个独立且高度内聚的模块,每个模块封装其特定功能,并通过定义良好的接口与其他模块交互。
用途:
- 代码组织:
-
提高代码的可读性、可维护性。
-
使项目结构清晰。
- 团队协作:
-
不同团队可以独立开发模块,降低耦合。
- 复用性:
-
通过封装和接口实现,模块可以在多个项目中复用。
- 调试和测试:
-
独立模块可以单独测试,降低复杂性。
相关概念:
- 模块(Module):
- 封装功能的独立单元,包含代码和资源(如 ES Modules、CommonJS 模块)。
- 例如在 JavaScript 中,import 和 export 用于模块化。
- 封装(Encapsulation):
- 将实现细节隐藏在模块中,仅暴露必要接口供外部使用。
- 组件化(Componentization):
- 模块化的一种具体实现形式,常用于前端开发(如 React、Vue 中的组件)。
- 分层架构(Layered Architecture):
- 通过逻辑分层(UI 层、业务逻辑层、数据层)实现模块化。
AOP(面向切面编程,Aspect-Oriented Programming)
定义:
AOP 是一种编程范式,旨在通过分离横切关注点(Cross-Cutting Concerns)来增强关注点分离。横切关注点是指影响多个模块但不属于主要 业务逻辑的功能,例如日志记录、安全检查、事务管理等。
用途:
- 增强关注点分离:
-
将非核心业务逻辑(如日志、缓存)从主要代码中提取出来。
- 简化代码:
-
避免在多个地方重复实现横切关注点,减少代码冗余。
- 动态扩展功能:
-
可以在不修改原代码的情况下动态添加行为(例如通过装饰器、拦截器)。
- 提高代码可维护性:
-
将关注点集中管理,使核心逻辑更加清晰。
相关概念:
- 横切关注点(Cross-Cutting Concerns):
- 功能性需求,通常跨越多个模块(如安全性、事务性)。
- 切面(Aspect):
- 表示横切关注点的实现单元(如日志切面、权限切面)。
- 切入点(Join Point):
- 代码中允许横切逻辑插入的位置(如方法执行、属性访问)。
- 通知(Advice):
- 在切入点处执行的操作(如方法前执行、方法后执行)。
- 装饰器和拦截器:
- 在 AOP 中实现横切关注点的常用工具。
微服务(Microservices)
定义:
微服务是一种架构风格,将单体应用拆分为多个独立的小服务,每个服务负责特定领域,具有独立的数据库、代码库和部署生命周期。服务之间通过 轻量协议(如 HTTP、消息队列)通信。
用途:
- 解耦:
- 各服务独立运行、部署和扩展,降低模块间的依赖性。
- 技术灵活性:
- 不同服务可以采用不同的技术栈和编程语言。
- 独立部署 :
- 单一服务的修改不会影响整个系统,支持快速迭代。
- 弹性扩展:
- 根据流量需求,独立扩展某些服务(如只扩展用户服务)。
- 高可用性:
- 某些服务失败时,其他服务仍可运行,减少系统崩溃风险。
相关概念:
- 单体架构(Monolithic Architecture):
- 与微服务对立,所有功能放在一个整体中。
- 适合小型项目,但扩展性和维护性差。
- 服务发现(Service Discovery):
- 微服务动态注册和寻找其他服务的机制。
- API 网关(API Gateway):
- 微服务的入口,负责路由请求、认证等功能。
- 轻量通信协议:
- 服务之间通过 REST、GraphQL 或消息队列(如 RabbitMQ、Kafka)通信。
- 容器化(Containerization):
- 微服务通常通过容器(如 Docker)进行封装和部署。
Front End
- 设计Token
Back End
- 服务启动模式。前台启动(命令行)、后台启动(-d detached)
docker run my-service
docker run -d my-service