在上一节中,我们介绍了Nest服务的基本启动流程,其中涉及到了Module、Controller、Service三个主要术语,简单介绍了下它们的含义,并留下了一道思考题。
那么接下来我们是不是要对Module、Controller、Service这三者进行详细的介绍呢?别急,工欲善其器必先利其器,在后面的学习中会多次用到Nest的命令行工具,因此我们有必要抽出几分钟学习一下这个命令行工具的使用。
nest提供的命令里有6个大类,涵盖了:
- 新建:
new | n - 运行:
start - 创建模块:
generate| g - 打包:
build - 查看项目信息:
info | i - 添加依赖项:
add
其中,add命令我们用的比较少,因此这里先暂时不表,感兴趣的同学可以翻翻NestJS官网。接下来我们就了解下常用的那几个,毕竟我们的目的不是为了记住全部的知识点,而是理解并记住其中的20%,用这20%完成80%的场景的开发工作。
new
第一个是new命令,这个命令我们在第一节里创建初始Nest项目的时候用过,其命令的格式如下:
nest new|n [options] [name]
这里补充一下命令行的一些小知识点:竖线
|标识表示new可以简写为n,中括号[]标识表示options是可选项。
常用的选用有:-g、-p、-s,剩下的我会以备注的形式补充,大家看一眼即可。
--directory:用来指定项目的创建路径,默认是当前路径。若指定了路径,则末尾路径将成为文件名。路径不存在时会自动创建。--dry-run/-d:指定命令正常执行,但是不会产生任何结果。也就是用来模拟查看某个命令的执行流程的。--language/-l:指定nest应用的脚本语言,可以选择JavaScript或者TypeScript,默认是后者。--collection/-c:指定nest应用的collection集合,我们在第一节里最开始讲解.nest-cli.json文件的时候提过这个字段。--strict:指定nest应用是否使用严格模式,默认不启用。
-g,即--skip-git的简写:跳过git仓库的初始化,即不生成.git文件夹。-p,即--package-manager的简写:指定包管理依赖工具,比如指定包管理工具为npm或者pnpm之类的。-s,即--skip-install的简写:跳过依赖的安装,即新建项目时不安装依赖,后续再手动安装。
接下来我们结合一个例子来理解下
nest n demo2 -g -p pnpm -s
上述这条命令里,n是new的缩写,demo2是项目名称,-g指定跳过了git仓库初始化,-p pnpm指定包管理依赖工具为pnpm,-s指定跳过依赖安装这一步,生成的项目文件如下图:
start
通过new命令新建完项目后,装好依赖,就开始启动服务了。Nest中启动服务的命令是start命令,所以接下来我们要了解下这个命令的使用方式。
该命令的格式如下:
nest start [optoins] [app]
其中[app]这个是可选值,表示项目启动的根路径入口,[options]表示可选项,而常用的命令参数就只有:-w。
-w/--watch,其中-w是--watch参数的简写:监听文件的变动并自动刷新,也就是以热更新的模式启动服务。
如果不带任何参数执行nest start,将只启动服务,且不带有热更新,因此如果改了代码后重新请求发现没有变化,要检查下是不是启动服务时没指定热更新。
以上命令参数在package.json里的脚本字段scripts中有,其中start:dev就是nest start --watch,平时开发的时候就用start:dev即可。
其他剩下的参数我们以备注的形式放在下面,现在过一遍即可,以后遇到了再回来查看。
-c/--config [path]:指定配置文件nest-cli.json的路径,默认为根路径。-p/--path [path]:指定tsconfig.json文件路径。-b/--builder [name]:在使用monorepo方式管理多个nest应用时,可以通过该命令指定所需要启动的应用。--watchAssets:监听静态文件更新,需要在nest-cli.json中指定静态文件路径。-d/--debug [hostport]:以debug模式启动。--webpack:使用webpack构建应用。--webpackPath [path]:指定webpack配置文件路径。--type-check:启用 TypeScript 类型检查。在构建或启动项目时进行严格的类型检查,这可以确保我们的代码没有类型错误。--tsc:使用 TypeScript 编译器而不是 Webpack 或其他构建工具来编译项目,适合简单的项目。--sourceRoot [sourceRoot]:指定源代码的根目录。--entryFile [entryFile]:默认情况下,NestJS 使用main.ts作为入口文件。如果你的入口文件不同,可以通过这个参数指定。--preserveWatchOutput:该字段是TypeScript编译器的一个选项,用于保留监视模式下的输出。
这个比较简单,我们就不举例子了。
add
这个命令我们基本用不到,可以先不用管。
generate
这条命令是我们本节的重点,用于生成不同类型的文件和代码模板,如控制器、服务、模块等。其命令格式如下:
nest generate|g <schematic> [name] [options]
其中:
-
<schematic>:生成的文件类型,如controller、service、module、resource等。 -
[name]:生成的文件名或文件路径。可选参数,如果不指定,默认使用schematic的名称作为文件名。 -
[options]:可选参数,常用的有如下几个:--flat:生成的模块以平铺的形式展示,即不放在单独的文件夹里。--no-falt:生成的模块不以平铺的形式展示,即模块都在单独的一个文件夹内生成。若不指定--flat和--no-falt,默认为--no-flat。--spec:附带生成测试文件。当生成为文件类型是resource时,不指定--spec和--no-spec时,默认为--spec,即默认生成测试文件。--no-spec:不生成测试文件。--skip-import:指定不在 AppModule 里引入生成的新模块。
剩下的一些可选参数如下:
--dry-run/-d:指定命令正常执行,但是不会产生任何结果。也就是用来模拟查看某个命令的执行流程的。(这个参数在new命令里也有)。--project/-p [project]:指定生成代码在哪个子项目下,这个在monorepo项目中会用到。
接下来我们结合几个例子来理解。
例子1:生成单独的文件,或者module文件,或者service文件,或者controller文件。
nest g module cat
上述这条命令里,我们生成了一个module叫 cat,我们详细讲解下可选参数的使用:
- 由于没有指定
--flat,因此生成的cat.module.ts文件是放在cat文件夹下的。 - 由于没有指定
--skip-import,因此生成的cat.module会被自动引入到app.module.ts文件里。 - 由于不是生成
resource,因此--spec和--no-spec参数便无需理会。
这里我们引入了一个新的名词:resource。这里我们稍微解释下,我们用nest g module cat或者nest g service cat或者nest g controller cat的话,生成的都是单独一个文件,那如果我们需要生成完整的一个模块,这时候就需要用nest g resource xxx了。
例子2:生成完整的模块。
nest g resource dog
在这个例子中,我们用generate命令生成一个完整的模块dog,这里有三个注意点:
- 该模块包括了
module、controller、service及后两者的测试文件,以及dto、entities文件夹。其中dto、entities文件夹暂时不用理会,后续再讲解。 - 由于没有指定
--flat,因此生成的所有文件都是放在dag文件夹下的。 - 由于没有指定
--spec和--no-spec参数,因此会还有controller与service的测试文件。 - 由于没有指定
--skip-import,因此生成的dog.module会被自动引入到app.module.ts文件里。
以上便是generate命令的初步应用以及例子讲解,接下来我们看看build命令。
build
该命令用来编译整个项目,执行build命令,会在dist文件夹下生成编译后文件。其命令格式如下:
nest build [options] [app]
-
[app]:指定编译的子项目名,在monorepo项目中会用到。 -
[options]:可选参数,常用的有如下几个:--config/-c [path]:nest-cli.json配置文件位置。--path/-p [path]:tsconfig.json配置文件的位置。--watch/-w:监听文件变动,自动执行build命令,但是该命令只能监听js、ts文件变动。--watchAssets:监听静态文件变动,自动执行build命令,可以换配置-w一起使用。--builder/-b [name]:指定编译的工具,如tsc、webpack、swc等。--type-check:在构建时启用严格的类型检查。--webpackPath [path]:webpack的配置文件路径。--tsc:使用TypeScript编译器,默认选项。--preserveWatchOutput在监视模式下编译代码时,会保留控制台的输出日志。
这条命令的参数比较简单,我们先过一遍,后续遇到了再详细讲解。
以上便是nest命令行工具的初步内容,对于入门这来说,我们不需要掌握太深,太多的内容反而容易加重心智负担,从而导致放弃,一点点来,坚持下去才是最重要的,加油~