Nest.js
简介
通过脚手架npx @nestjs/cli new
创建的项目基本上都是引导 typescript starter 项目,可能有点臃肿了。我们希望从头开始创建一个新的 NestJS 标准应用程序,并且完全控制依赖项、脚本和源代码。
工具:
- nodejs,它是一个JavaScript运行时(Node.js v20 是最低要求)
- npm,包管理器
- npx,用于执行 npm 包中的一些工具
- shell,终端,根据个人喜好
最终的项目结构:
bash
.
├── nest-cli.json
├── package.json
├── package-lock.json
├── src
│ ├── app.module.ts
│ └── main.ts
├── tsconfig.build.json
└── tsconfig.json
1 directory, 7 files
具有 4 个开发依赖项和 4 个生产依赖项。而且只有 3 个 NPM 脚本。
bash
$ npm ls --depth=0
[email protected] /tmp/my-nestjs-app
├── @nestjs/[email protected]
├── @nestjs/[email protected]
├── @nestjs/[email protected]
├── @nestjs/[email protected]
├── @nestjs/[email protected]
├── @types/[email protected]
├── [email protected]
└── [email protected]
初始化
bash
mkdir my-nestjs-app
cd my-nestjs-app
npm init -y
依赖安装
将安装所有必需的依赖项,作为开发/生产依赖项,我们需要:
bash
npm install reflect-metadata @nestjs/common @nestjs/core
npm install @nestjs/platform-express
reflect-metadata 用于 TypeScript 装饰器的内省(即通过装饰器获取类、方法、属性等元数据的机制)
@nestjs/platform-express 由于我们将使用 express 作为底层 HTTP 库:
开发依赖项:
bash
npm install --save-dev typescript @types/node @nestjs/cli @nestjs/schematics
配置 package.json:
json
{
"name": "my-nestjs-app",
"version": "1.0.0",
"main": "dist/src/main",
"scripts": {
"build": "nest build",
"start:dev": "nest start --watch",
"start:prod": "node ."
},
"keywords": [],
"author": "Micael Levi L. C.",
"license": "ISC",
"description": "",
"dependencies": {
"@nestjs/common": "^11.0.3",
"@nestjs/core": "^11.0.3",
"@nestjs/platform-express": "^11.0.3",
"reflect-metadata": "^0.2.2"
},
"devDependencies": {
"@nestjs/cli": "^11.0.0",
"@nestjs/schematics": "^11.0.0",
"@types/node": "^22.10.7",
"typescript": "^5.7.3"
}
}
必要文件
- 创建一个带有 NestJS 模块的
src
目录, - 根目录中的
tsconfig.json
文件, - 根目录中的
tsconfig.build.json
文件,用于编译用于生产的 TypeScript 项目, - 根目录中的
nest-cli.json
文件,用于配置 NestJS 的 CLI。
json
// tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"declaration": true,
"removeComments": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"allowSyntheticDefaultImports": true,
"target": "ES2024",
"sourceMap": true,
"outDir": "./dist",
"rootDir": "./",
"baseUrl": "./",
"skipLibCheck": true,
"incremental": true
}
}
json
// tsconfig.build.json
{
"extends": "./tsconfig.json",
"exclude": ["node_modules", "test", "dist", "**/*spec.ts"]
}
json
// nest-cli.json
{
"\$schema": "https://json.schemastore.org/nest-cli",
"collection": "@nestjs/schematics",
"monorepo": false,
"sourceRoot": "src",
"entryFile": "main",
"language": "ts",
"generateOptions": {
"spec": false
},
"compilerOptions": {
"tsConfigPath": "./tsconfig.build.json",
"webpack": false,
"deleteOutDir": true,
"assets": [],
"watchAssets": false,
"plugins": []
}
}
bash
# 创建一个最小化的应用根模块
npx nest generate module app --flat
ts
// src/main.ts
import { NestFactory } from '@nestjs/core';
import type { NestExpressApplication } from '@nestjs/platform-express';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create<NestExpressApplication>(AppModule);
await app.listen(process.env.PORT || 3000);
}
bootstrap();
运行应用
对于开发:
bash
npm run start:dev
对于生产:
bash
npm run build
rm -rf node_modules
## 在不修改锁文件的情况下安装仅用于生产环境的依赖项
npm ci --omit=dev
## 使用 “main” 入口启动应用程序
node .