安装与项目初始化

学习目标

  • 掌握 Node.js 环境的配置方法
  • 学会使用 Nest CLI 创建和管理项目
  • 理解 NestJS 项目的基本结构和文件作用
  • 能够独立初始化一个 NestJS 项目
  • 了解如何配置和定制 NestJS 项目

核心知识点

1. Node.js 环境配置

1.1 Node.js 安装

NestJS 是基于 Node.js 构建的,因此首先需要安装 Node.js。建议安装 Node.js 16.0 或更高版本,以确保兼容性和稳定性。

Windows 系统安装步骤:

  1. 访问 Node.js 官网
  2. 下载适合 Windows 系统的安装包(推荐 LTS 版本)
  3. 运行安装包,按照向导完成安装
  4. 安装完成后,打开命令提示符,运行 node -vnpm -v 验证安装成功

macOS 系统安装步骤:

  1. 访问 Node.js 官网
  2. 下载适合 macOS 系统的安装包(推荐 LTS 版本)
  3. 运行安装包,按照向导完成安装
  4. 安装完成后,打开终端,运行 node -vnpm -v 验证安装成功

Linux 系统安装步骤:

  1. 使用包管理器安装,例如 Ubuntu 系统可以使用以下命令:
    sudo apt update
    sudo apt install nodejs npm
  2. 或者使用 nvm(Node Version Manager)安装和管理多个 Node.js 版本:
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
    nvm install node
  3. 安装完成后,运行 node -vnpm -v 验证安装成功

1.2 npm 配置

npm 是 Node.js 的包管理器,用于安装和管理依赖包。在使用 npm 时,可以进行一些配置以提高使用体验:

  1. 设置 npm 镜像:由于网络原因,可以设置国内镜像以提高下载速度:

    npm config set registry https://registry.npmmirror.com
  2. 设置全局安装路径:默认情况下,全局安装的包会安装到系统目录,可以设置为用户目录:

    npm config set prefix "$HOME/.npm-global"
  3. 更新 npm:确保使用最新版本的 npm:

    npm install -g npm@latest

2. Nest CLI 使用

Nest CLI 是一个命令行工具,用于生成 NestJS 项目和各种组件,大大提高了开发效率。

2.1 安装 Nest CLI

使用 npm 全局安装 Nest CLI:

npm install -g @nestjs/cli

安装完成后,可以通过以下命令检查 Nest CLI 的版本:

nest --version

2.2 Nest CLI 常用命令

Nest CLI 提供了丰富的命令,以下是一些常用命令:

命令 描述
nest new <project-name> 创建新的 NestJS 项目
nest generate module <module-name> 生成新的模块
nest generate controller <controller-name> 生成新的控制器
nest generate service <service-name> 生成新的服务
nest generate pipe <pipe-name> 生成新的管道
nest generate guard <guard-name> 生成新的守卫
nest generate interceptor <interceptor-name> 生成新的拦截器
nest generate filter <filter-name> 生成新的异常过滤器
nest build 构建项目
nest start 启动项目
nest start --watch 以监视模式启动项目
nest start:dev 启动开发服务器(等同于 nest start --watch
nest start:debug 以调试模式启动项目
nest start:prod 启动生产服务器

2.3 命令简写

Nest CLI 支持命令简写,例如:

  • nest g module <module-name> 等同于 nest generate module <module-name>
  • nest g controller <controller-name> 等同于 nest generate controller <controller-name>
  • nest g service <service-name> 等同于 nest generate service <service-name>

3. 项目结构解析

NestJS 项目具有清晰的目录结构,了解这些结构对于开发和维护项目非常重要。

3.1 默认项目结构

使用 Nest CLI 创建的默认项目结构如下:

project-name/
├── src/
│   ├── app.controller.ts
│   ├── app.controller.spec.ts
│   ├── app.module.ts
│   ├── app.service.ts
│   └── main.ts
├── test/
│   ├── app.e2e-spec.ts
│   └── jest-e2e.json
├── .eslintrc.js
├── .gitignore
├── .prettierrc
├── nest-cli.json
├── package.json
├── README.md
├── tsconfig.build.json
└── tsconfig.json

3.2 主要文件和目录的作用

  • src/ 目录:包含应用程序的源代码

    • main.ts:应用程序的入口文件,负责创建和启动 NestJS 应用实例
    • app.module.ts:应用程序的根模块,负责组织和配置其他组件
    • app.controller.ts:示例控制器,处理 HTTP 请求
    • app.service.ts:示例服务,包含业务逻辑
    • app.controller.spec.ts:控制器的测试文件
  • test/ 目录:包含端到端测试文件

    • app.e2e-spec.ts:端到端测试文件
    • jest-e2e.json:端到端测试的 Jest 配置文件
  • 配置文件

    • package.json:包含项目依赖和脚本
    • tsconfig.json:TypeScript 配置文件
    • tsconfig.build.json:构建时的 TypeScript 配置文件
    • nest-cli.json:Nest CLI 配置文件
    • .eslintrc.js:ESLint 配置文件
    • .prettierrc:Prettier 配置文件
    • .gitignore:Git 忽略文件配置

4. 项目配置和定制

NestJS 项目可以根据需要进行配置和定制,以下是一些常见的配置项:

4.1 package.json 配置

package.json 文件包含项目的依赖和脚本配置:

{
  "name": "project-name",
  "version": "0.0.1",
  "description": "",
  "author": "",
  "private": true,
  "license": "UNLICENSED",
  "scripts": {
    "build": "nest build",
    "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
    "start": "nest start",
    "start:dev": "nest start --watch",
    "start:debug": "nest start --debug --watch",
    "start:prod": "node dist/main",
    "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
    "test": "jest",
    "test:watch": "jest --watch",
    "test:cov": "jest --coverage",
    "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
    "test:e2e": "jest --config ./test/jest-e2e.json"
  },
  "dependencies": {
    "@nestjs/common": "^10.0.0",
    "@nestjs/core": "^10.0.0",
    "@nestjs/platform-express": "^10.0.0",
    "reflect-metadata": "^0.1.13",
    "rxjs": "^7.8.1"
  },
  "devDependencies": {
    "@nestjs/cli": "^10.0.0",
    "@nestjs/schematics": "^10.0.0",
    "@nestjs/testing": "^10.0.0",
    "@types/express": "^4.17.17",
    "@types/jest": "^29.5.2",
    "@types/node": "^20.3.1",
    "@types/supertest": "^2.0.12",
    "@typescript-eslint/eslint-plugin": "^6.0.0",
    "@typescript-eslint/parser": "^6.0.0",
    "eslint": "^8.42.0",
    "eslint-config-prettier": "^8.8.0",
    "eslint-plugin-prettier": "^4.2.1",
    "jest": "^29.5.0",
    "prettier": "^2.8.8",
    "source-map-support": "^0.5.21",
    "supertest": "^6.3.3",
    "ts-jest": "^29.1.0",
    "ts-loader": "^9.4.3",
    "ts-node": "^10.9.1",
    "tsconfig-paths": "^4.2.0",
    "typescript": "^5.1.3"
  }
}

4.2 tsconfig.json 配置

tsconfig.json 文件包含 TypeScript 的配置:

{
  "compilerOptions": {
    "module": "commonjs",
    "declaration": true,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "allowSyntheticDefaultImports": true,
    "target": "ES2021",
    "sourceMap": true,
    "outDir": "./dist",
    "baseUrl": "./",
    "incremental": true,
    "skipLibCheck": true,
    "strictNullChecks": false,
    "noImplicitAny": false,
    "strictBindCallApply": false,
    "forceConsistentCasingInFileNames": false,
    "noFallthroughCasesInSwitch": false
  }
}

4.3 nest-cli.json 配置

nest-cli.json 文件包含 Nest CLI 的配置:

{
  "$schema": "https://json.schemastore.org/nest-cli",
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "compilerOptions": {
    "deleteOutDir": true
  }
}

实践案例

使用 Nest CLI 初始化项目

步骤 1:创建新项目

使用 Nest CLI 创建一个名为 nestjs-blog 的新项目:

nest new nestjs-blog

执行命令后,CLI 会提示你选择包管理器:

? Which package manager would you ❤️  to use? (Use arrow keys)
❯ npm
  yarn
  pnpm

选择 npm 并按下 Enter 键。

步骤 2:等待项目创建完成

CLI 会自动创建项目目录结构,并安装所需的依赖包。这个过程可能需要几分钟时间,取决于你的网络速度。

步骤 3:进入项目目录

项目创建完成后,进入项目目录:

cd nestjs-blog

步骤 4:查看项目结构

使用 ls -la 命令查看项目结构:

ls -la

你应该能看到类似以下的输出:

total 160
drwxr-xr-x  13 user  group   416 Jul  1 10:00 .
drwxr-xr-x   3 user  group    96 Jul  1 09:59 ..
drwxr-xr-x   8 user  group   256 Jul  1 10:00 .git
drwxr-xr-x   3 user  group    96 Jul  1 10:00 dist
drwxr-xr-x   3 user  group    96 Jul  1 10:00 node_modules
drwxr-xr-x   3 user  group    96 Jul  1 10:00 src
drwxr-xr-x   3 user  group    96 Jul  1 10:00 test
-rw-r--r--   1 user  group   576 Jul  1 10:00 .eslintrc.js
-rw-r--r--   1 user  group   241 Jul  1 10:00 .gitignore
-rw-r--r--   1 user  group    42 Jul  1 10:00 .prettierrc
-rw-r--r--   1 user  group   194 Jul  1 10:00 nest-cli.json
-rw-r--r--   1 user  group 32503 Jul  1 10:00 package-lock.json
-rw-r--r--   1 user  group  1896 Jul  1 10:00 package.json
-rw-r--r--   1 user  group   334 Jul  1 10:00 README.md
-rw-r--r--   1 user  group   546 Jul  1 10:00 tsconfig.build.json
-rw-r--r--   1 user  group   938 Jul  1 10:00 tsconfig.json

步骤 5:查看源代码文件

进入 src 目录,查看源代码文件:

cd src
ls -la

你应该能看到以下文件:

total 24
drwxr-xr-x   2 user  group    64 Jul  1 10:00 .
drwxr-xr-x  13 user  group   416 Jul  1 10:00 ..
-rw-r--r--   1 user  group   280 Jul  1 10:00 app.controller.spec.ts
-rw-r--r--   1 user  group   249 Jul  1 10:00 app.controller.ts
-rw-r--r--   1 user  group   240 Jul  1 10:00 app.module.ts
-rw-r--r--   1 user  group   169 Jul  1 10:00 app.service.ts
-rw-r--r--   1 user  group   208 Jul  1 10:00 main.ts

步骤 6:启动开发服务器

返回项目根目录,启动开发服务器:

cd ..
npm run start:dev

开发服务器启动后,你应该能看到类似以下的输出:

[Nest] 12345  - 07/01/2023, 10:05:00 AM     LOG [NestFactory] Starting Nest application...
[Nest] 12345  - 07/01/2023, 10:05:00 AM     LOG [InstanceLoader] AppModule dependencies initialized
[Nest] 12345  - 07/01/2023, 10:05:00 AM     LOG [RoutesResolver] AppController {/}: 
[Nest] 12345  - 07/01/2023, 10:05:00 AM     LOG [RouterExplorer] Mapped {/, GET} route
[Nest] 12345  - 07/01/2023, 10:05:00 AM     LOG [NestApplication] Nest application successfully started on port 3000

步骤 7:验证服务器运行状态

打开浏览器,访问 http://localhost:3000,你应该能看到默认的欢迎消息:

Hello World!

步骤 8:修改默认控制器

打开 src/app.controller.ts 文件,修改默认的 getHello 方法:

import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
getHello(): string {
    return this.appService.getHello();
  }

  @Get('blog')
getBlog(): string {
    return 'Welcome to NestJS Blog!';
  }
}

保存文件后,开发服务器会自动重新加载。现在你可以在浏览器中访问 http://localhost:3000/blog,看到新的消息:

Welcome to NestJS Blog!

互动思考问题

  1. 为什么需要安装 Node.js 环境?NestJS 对 Node.js 版本有什么要求?
  2. Nest CLI 有哪些常用命令?它们的作用是什么?
  3. NestJS 项目的默认结构是怎样的?各个文件和目录的作用是什么?
  4. 如何配置和定制 NestJS 项目?
  5. 在初始化项目过程中,你遇到了什么问题?是如何解决的?
  6. 你认为项目初始化阶段需要注意哪些事项?

小结

本课程详细介绍了 NestJS 的环境配置和项目创建方法,包括 Node.js 环境配置、Nest CLI 使用和项目结构解析。通过实践案例,我们演示了如何使用 Nest CLI 初始化一个 NestJS 项目,并验证了服务器的运行状态。

Nest CLI 是一个强大的工具,它大大简化了 NestJS 项目的创建和管理过程。通过掌握 Nest CLI 的使用方法,你可以更加高效地开发 NestJS 应用。

了解 NestJS 项目的结构对于后续的开发和维护非常重要。每个文件和目录都有其特定的作用,合理组织项目结构可以提高代码的可维护性和可读性。

在下一课程中,我们将学习 NestJS 的控制器 (Controllers),了解如何使用控制器处理 HTTP 请求和响应。

« 上一篇 框架介绍 下一篇 » NestJS控制器 (Controllers)