相信CLI对于读者来说并不陌生,它广泛应用于各个工程化领域,用于快速创建项目、运行编译、执行构建等操作,如前端的Vue CLI、Vite、Create React App,后端的Spring Boot CLI、express-generator等。Nest也不例外,提供了强大的CLI命令行工具,它被放在@nestjs/cli包中。本节首先介绍CLI的安装并创建一个实际的项目,接着通过项目演示来介绍它生成各种代码片段的命令,帮助读者彻底掌握CLI的使用。
执行以下命令可将Nest CLI安装为全局工具,方便日后使用:
npm install -g @Nestjs/cli
需要注意的是,这种方式需要不定时更新,以获取最新的模板代码:
npm update -g @Nestjs/cli
安装完成之后,执行“nest –h”命令,结果如图2-1所示。
图2-1 “nest –h”命令的执行结果
由图2-1可见,Nest提供了非常丰富的命令。
● nest new:用于创建项目。
● nest build:用于构建生产环境代码。
● nest start:用于启动本地开发服务。
● nest info:用于查看当前项目中的Nest包信息。
● nest add:用于添加官方插件或者第三方模块。
● nest generate:用于生成各种模块代码,如Module、Controller、Service、Pipe、Middleware等。
同时,部分命令也支持别名,如“nest n”“nest i”“nest g”,后续将分别进行测试。
用户可以用“nest new”命令来创建项目,具体参数如图2-2所示。
图2-2 创建项目时可以使用的参数选项
下面挑选几个常用的参数进行说明。
● --skip-git和--skip-install:这些参数用于跳过Git初始化和npm包安装步骤。
● --package-manager:此参数用于指定项目使用的包管理器(npm、yarn、pnpm)。推荐使用pnpm,它作为继npm、yarn之后推出的包管理器,因其速度快、节省磁盘空间而受到青睐。
● --language:此参数决定使用TypeScript还是JavaScript进行编写。推荐使用默认的TypeScript。
● --collection:用于指定工作流集合。默认是@nestjs/schematics,用于快速创建模块、控制器、服务等,与“nest generate”命令相关。通常使用默认值,后续将详细讲解。
● --strict:此参数用于指定TypeScript是否以严格模式运行。
运行“nest n cli-test”命令后,CLI提供了交互式命令让你选择包管理器,如图2-3所示。
图2-3 选择包管理器
当然,我们可以直接使用“nest n cli-test -p pnpm”命令来指定使用pnpm,如图2-4所示。
图2-4 指定pnpm
由图2-4可见,CLI直接创建默认的项目模板,然后执行安装依赖,完成后自动创建一个pnpm-lock.yaml文件,如图2-5所示。
图2-5 自动创建pnpm-lock.yaml文件
“nest generate”命令默认执行的是@nestjs/schematics包中的命令。而Schematics是一种用于创建、删除和更新Angular应用程序代码的工具。Nest在此基础上进行了扩展和定制,以适应其框架的需求。
执行“nest generate -h”命令来生成指定的代码片段,可以查看其中包含的内容,如图2-6所示。
图2-6 生成指定代码片段的命令参数
其中包含丰富的Nest元素(如Controller、Decorator、Filter等),同时提供了灵活的参数控制。
我们来试一下,进入刚刚创建的项目cli-test,执行“nest g controller”命令,如图2-7所示。
图2-7 使用命令生成控制器(controller)
接着可以看见在src目录下创建了一个user控制器,如图2-8所示。
图2-8 生成user控制器结果
其中,.spec.ts是单元测试文件,可以通过设置--no-spec参数表明不生成测试文件。
● --flat和--not-flat这两个参数表示是否使用扁平化结构。我们接着创建一个user过滤器来测试。
● --flat:参数表示扁平化,会将生成的文件放到src目录下,而不生成对应的目录,如图2-9所示。
图2-9 使用扁平化参数对应的执行结果
● --not-flat:参数表示非扁平化,会生成对应的目录,如图2-10所示。
图2-10 非扁平化参数执行结果
● --skip-import表示是否跳过自动导入依赖,默认情况下会自动导入,以user controller为例,如图2-11所示。
图2-11 默认自动导入依赖的效果图
由图2-11可见,UserController会自动导入应用的主模块中,并自动将其添加到Controllers依赖项列表中。同样的流程也适用于生成Service服务和module模块。
然而,逐个创建Controller或Filters可能不够方便。能否一次性生成所需的模板呢?当然可以。Nest提供了nest generate resource命令,可以一键生成代码模板。执行该命令后,CLI会询问我们选择使用哪种代码风格。我们选择REST风格的API,如图2-12所示。
图2-12 选择不同风格的API
选择yes后,系统将自动生成与CRUD(创建、读取、更新、删除)相关的代码,如图2-13所示。
图2-13 选择CRUD入口节点
创建完成后,生成REST风格的API,内容如下:
import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common'; import { PersonService } from './person.service'; import { CreatePersonDto } from './dto/create-person.dto'; import { UpdatePersonDto } from './dto/update-person.dto'; @Controller('person') export class PersonController { constructor(private readonly personService: PersonService) {} @Post() create(@Body() createPersonDto: CreatePersonDto) { return this.personService.create(createPersonDto); } @Get() findAll() { return this.personService.findAll(); } @Get(':id') findOne(@Param('id') id: string) { return this.personService.findOne(+id); } @Patch(':id') update(@Param('id') id: string, @Body() updatePersonDto: UpdatePersonDto) { return this.personService.update(+id, updatePersonDto); } @Delete(':id') remove(@Param('id') id: string) { return this.personService.remove(+id); } }
dto和entities是CRUD相关的代码,最终集成到PersonModule中,并被自动导入AppModule,如图2-14所示。
图2-14 CRUD代码展示
以上就是Nest CLI提供的用于快速创建项目代码的工具。
前面介绍了nest generate命令,接下来使用new build命令来构建应用。
执行nest build –h命令,可以看到build命令提供了一些可选参数,如图2-15所示。
图2-15 build命令提供的参数
其中,各选项说明如下。
● --path:用于指定tsconfig文件的路径。
● --watch:开启实时监听模式,在文件发生变化时自动执行构建操作。
● --builder:选择使用指定的工具进行构建,可选的工具包括tsc、webpack、swc等。
默认情况下,Nest使用tsc进行编译,运行nest build命令的效果如图2-16所示。
若要切换为使用webpack进行打包,可以运行nest build-b webpack命令,效果如图2-17所示。
图2-16 构建之后的目录文件
图2-17 webpack打包后的目录文件
--webpack和--tsc分别指定了不同的编译器,webpack用于编译和打包,而tsc只用于编译,它们的运行效果与前文介绍的类似。
每次都需要在命令后面添加参数,这样有点麻烦,是否可以将这些参数写入配置文件中进行管理呢?答案是可以的。
● --config:指定nest-cli的配置文件路径,即nest-cli.json文件,可以用来配置打包参数,如图2-18所示。
图2-18 nest-cli的配置文件
由图2-18可以看到,前面提到的flat、spec都可以在这里进行配置。通过编译选项也可以指定是否使用webpack进行构建,以及是否使用builder指定选择的编译器等。
本小节将用nest start命令来启动开发调试,它的可选参数如图2-19所示。
图2-19 start命令提供的参数
在开发阶段,nest start命令用于开启本地服务。运行该命令的结果如图2-20所示。
图2-20 nest start运行结果
--debug参数用来调试。运行nest start–d命令后会启动一个WebSocket调试服务,通过调试工具链接到这个端口即可进行调试,如图2-21所示。
图2-21 带--debug参数运行nest命令的运行结果
详细的调试内容及技巧将在2.6节介绍。其他配置与build命令类似,这里不再赘述。
nest info命令用于查看Node.js、npm以及Nest依赖包的相关版本信息,如图2-22所示。
图2-22 nest info命令的执行结果