NestJs 是一个用于构建高效、可扩展的服务器端应用程序的渐进式 Node.js 框架,
有道是前端的 spring 框架 🤡 ~ (类比 java spring 全家桶👈) , 说是如此说 , 官网已经声明 , 它是仿Angular , AOP 思想很明显 👈
以下从其特点、核心概念、应用场景等方面进行介绍:
官网 : nest.nodejs.cn/
了解 NestJs
特点
- 强大的类型支持:基于 TypeScript 构建,利用 TypeScript 的静态类型检查功能,能在开发阶段提前发现许多潜在错误,提高代码的稳定性和可维护性,同时为开发者提供了更好的代码智能提示和自动完成功能,提升开发效率。
- 依赖注入机制:采用依赖注入模式,使得代码的各个模块之间的依赖关系更加清晰,易于管理和维护。各个模块可以通过依赖注入的方式获取所需的其他模块或服务,降低了模块之间的耦合度,提高了代码的可测试性和可扩展性。
- 丰富的插件生态:拥有大量的第三方插件和库,涵盖了数据库操作、身份验证、文件上传、消息队列等几乎所有常见的后端开发需求。可以方便地与各种数据库(如 MySQL、MongoDB 等)、消息队列系统(如 RabbitMQ、Kafka 等)进行集成。
- 支持多种平台:可以在多种环境中运行,包括服务器端、浏览器端以及移动应用开发中的后端服务等。可以轻松地部署到传统的服务器环境,也可以适应云原生架构,在容器化环境(如 Docker、Kubernetes)中运行。
核心概念
- 模块(Modules) :是 NestJs 应用的基本构建块,用于组织和分组相关的代码。每个模块都有一个明确的职责,可以包含控制器、服务、中间件、守卫等。
- 控制器(Controllers) :主要负责处理 HTTP 请求和响应。它定义了应用的路由路径和对应的处理函数,接收客户端发送的请求,调用相应的服务方法来处理业务逻辑,并将结果返回给客户端。
- 服务(Services) :用于封装具体的业务逻辑。它通常与数据库交互、进行数据处理、调用其他外部服务等。服务可以被控制器或其他服务注入和调用,以实现业务功能的复用。
- 中间件(Middleware) :在请求到达控制器之前或响应返回给客户端之前执行的函数,用于对请求和响应进行预处理或后处理。
- 守卫(Guards) :用于实现身份验证和授权功能。可以在路由级别或控制器级别使用守卫来保护应用的资源,只有通过身份验证和具有相应权限的用户才能访问受保护的路由。
应用场景
- 企业级 Web 应用:适用于构建大型的企业级 Web 应用,能够很好地处理复杂的业务逻辑、大量的用户请求以及与各种后端系统的集成。
- 微服务架构:非常适合用于构建微服务架构的应用,每个微服务可以作为一个独立的 NestJs 应用,通过 HTTP、gRPC 等通信方式进行交互。
- 实时应用:可以与 WebSocket 等技术结合,用于构建实时应用,如在线聊天、实时数据监控、游戏服务器等。
- 移动应用后端:为移动应用提供稳定、高效的后端支持,处理用户注册登录、数据存储和查询、推送通知等业务逻辑。
对比
优势
- 与JavaScript生态深度融合:NestJs基于JavaScript/TypeScript,能和前端技术栈无缝衔接,全栈开发时可共享代码逻辑与数据模型,减少开发和沟通成本,这方面Java集成相对复杂;和Python相比,NestJs构建前后端一体化应用更便捷,能更好利用前端JavaScript优势。
- 轻量级与快速开发:NestJs轻量级、启动快、开发效率高,适合快速迭代的中小型项目,比Java相对更轻便、配置启动更简单;在Web开发中,其架构清晰、代码组织规范,相比Python的Flask等框架,构建大型项目时更易维护和扩展。
- 基于依赖注入的可测试性:NestJs依赖注入机制和JavaScript模块化系统结合紧密,代码可测试性更高,测试代码编写更简洁直观,Java测试代码相对冗长;相比Python,NestJs的依赖注入框架更利于单元和集成测试,能提升代码质量和稳定性。
劣势
- 性能方面:处理高并发、大规模数据和复杂业务逻辑时,Java性能优势明显,其JVM优化成熟,内存管理和垃圾回收高效,NestJs可能存在性能瓶颈;在数据科学和数值计算领域,Python有高性能库,NestJs不适合这类复杂计算任务。
- 技术生态和成熟度:Java技术生态成熟,有Java EE体系和大量开源框架,解决方案完备,NestJs技术生态较新,复杂场景解决方案不够成熟;Python在数据科学、人工智能等领域优势显著,有丰富库和框架,NestJs在这方面不及Python。
- 人才储备和社区支持:Java社区庞大活跃,开发者众多,企业招聘容易,NestJs社区活跃度和人才数量较少;Python社区活跃,开源项目和库丰富,人才市场上Python开发者数量增长迅速,NestJs在这方面处于劣势。
初始化
1. 安装 Nest CLI
Nest CLI 是一个强大的命令行工具,可以帮助你快速创建和管理 Nest.js 项目。你可以通过 npm 全局安装 Nest CLI:
bash
npm install -g @nestjs/cli
3. 创建新项目
使用 Nest CLI 创建一个新的 Nest.js 项目非常简单。你只需要运行以下命令:
arduino
nest new project-name
在这里,将 project-name
替换为你的项目名称。运行该命令后,CLI 会提示你选择包管理器(npm 或 yarn),选择你喜欢的包管理器,然后 CLI 会自动为你安装项目依赖。
4. 运行项目
进入项目目录并启动开发服务器:
arduino
cd project-name
npm run start
默认情况下,Nest.js 应用会在 http://localhost:3000
上运行
项目结构
项目成功初始化后 , 项目结构如下 :
以下是对该NestJS项目结构中各文件及文件夹作用的详细解析:
文件夹
dist
:存放编译后的文件。NestJS项目常使用TypeScript编写,该目录是TypeScript代码经编译转化为JavaScript后的输出位置。在项目运行时,实际执行的是此目录下的代码。node_modules
:用于存储项目所依赖的第三方包。开发过程中用到的各类NestJS相关模块、工具库等,比如处理HTTP请求的库、数据库连接库、各种辅助功能的插件等,都会被安装到这个目录中。src
:项目的核心源代码目录,包含了应用的主要业务逻辑、模块定义、控制器、服务等关键代码。开发者主要在此目录下进行功能开发工作,例如创建新的模块来处理特定业务场景、编写控制器以处理客户端请求、编写服务来实现具体的业务逻辑等。test
:专门用于存放测试代码的目录。在这里可以编写单元测试、集成测试等各种类型的测试用例,目的是确保项目代码的质量和稳定性,验证各个功能模块是否能够按照预期正常工作。
src
目录下的文件
app.controller.spec.ts
:这是app.controller.ts
对应的测试文件。通常用于编写针对AppController
的单元测试或集成测试用例,以验证AppController
中各个方法的功能是否正确,比如检查控制器对不同请求的响应是否符合预期等。app.controller.ts
:定义了应用的控制器(Controller)。控制器负责处理传入的HTTP请求,并返回相应的响应。它通常包含多个处理不同路由的方法,这些方法会调用对应的服务来获取数据或执行特定的业务逻辑,然后将处理结果返回给客户端。app.module.ts
:应用的根模块(Module)文件。在NestJS中,模块是组织代码的基本单元,它可以将相关的控制器、服务、组件等组合在一起,管理它们的生命周期和依赖关系。AppModule
通常会导入应用所需的其他模块,并声明本模块中使用的控制器、服务等。app.service.ts
:定义了应用的服务(Service)。服务用于封装具体的业务逻辑,控制器会调用服务中的方法来完成特定的业务操作,例如数据的获取、处理和存储等。服务可以被多个控制器共享,有助于提高代码的复用性和可维护性。main.ts
:应用的入口文件。它负责引导NestJS应用的启动,通常会创建Nest应用实例,导入根模块(如AppModule
),并启动HTTP服务器来监听指定的端口,使应用能够接收和处理客户端的请求。
其他配置及说明文件
.eslintrc.js
:ESLint的配置文件。ESLint是一个代码检查工具,此文件用于定义项目的代码规范和风格,例如缩进规则、变量命名规范、代码语法检查等。通过配置ESLint,可以帮助开发者保持代码风格的一致性,及时发现和修复代码中的潜在问题。.gitignore
:Git版本控制系统的忽略文件。用于指定哪些文件或目录不需要被Git跟踪,例如node_modules
目录(因为其体积较大且可以通过package - json
重新生成)、编译后的dist
目录等。这样可以避免将不必要的文件提交到代码仓库中。.prettierrc
:Prettier的配置文件。Prettier是一个代码格式化工具,该文件用于配置代码格式化的规则,比如代码的缩进方式、换行规则、引号类型等。配置好后,代码在保存时会自动按照设定的格式进行调整,使代码更加美观和易读。nest - cli.json
:NestJS命令行工具的配置文件。用于配置NestJS CLI(Command - Line Interface)的相关参数,例如生成代码时的默认路径、模板等。借助这个配置文件,开发者可以更方便地使用命令行快速生成模块、控制器、服务等代码结构。package - lock.json
:记录了node_modules
中每个包的确切版本信息。它的作用是确保团队成员在安装依赖包时,能够安装到与项目开发者完全相同版本的包,避免因依赖包版本差异而导致的问题。package.json
:项目的核心配置文件。其中包含了项目的元数据信息,如项目名称、版本、作者等;还记录了项目的依赖关系,dependencies
字段记录生产环境下所需的依赖包,devDependencies
字段记录开发环境下所需的依赖包;此外,还可以定义各种脚本命令,例如启动项目、运行测试等。README.md
:项目的说明文档。通常会包含项目的介绍、安装步骤、使用方法、示例代码等信息,目的是帮助其他开发者快速了解和使用该项目。tsconfig.build.json
:可能是用于项目构建时的TypeScript配置文件。它与项目的编译过程相关,可以指定一些编译选项,比如目标JavaScript版本、模块解析策略、路径映射等,以满足特定的构建需求。tsconfig.json
:项目整体的TypeScript配置文件。定义了TypeScript编译的各种选项,例如include
字段指定哪些文件或目录需要被包含在编译范围内,exclude
字段指定哪些需要被排除,compilerOptions
中则定义了类型检查、模块系统、严格模式等众多编译相关的设置。
强迫症: 暂时关掉语法检查
开始可能会因为语法检查爆红 , 可以在.eslintrc.js 中暂时注释掉一下代码 :
玩耍
在浏览器中访问http://localhost:3000
我们一起找一下问什么返回 Hello world
找到 Controller 层
顺着他找到在 Service 层的 getHello
这里就是返回的结果 , 其实 NestJs 有着前端 spring 之称呼 , 看到这里 , 让人不禁想起 javaweb 中的经典三层架构用于分层解耦
总结
临时起意 , 看到 NestJs , 初始化一个 nest-start-demo 玩玩 , 之后会深入学习 ~ , 从基础到实战 !