小满nestjs(第六章 CLI实战:从零到一构建项目骨架)
1. 为什么需要NestJS CLI刚开始接触NestJS时我完全手动创建过项目。结果花了一整天时间配置各种依赖和目录结构最后发现连热更新都没搞定。后来发现NestJS CLI只需要一条命令就能解决所有问题真是后悔没早点用。CLI工具就像是一个经验丰富的项目架构师。它知道标准的项目目录应该怎么组织需要安装哪些核心依赖如何配置TypeScript编译选项怎样设置开发和生产环境的不同启动脚本手动创建项目最大的问题是容易遗漏关键配置。比如有一次我忘记配置tsconfig.json中的experimentalDecorators导致所有装饰器语法都报错排查了半天才发现问题。而CLI生成的项目从一开始就规避了这些坑。2. 快速创建你的第一个NestJS项目2.1 环境准备首先确保你的开发环境已经安装Node.js (建议16.x或18.x LTS版本)npm或yarn包管理器推荐使用VS Code作为IDE安装NestJS CLI全局工具npm install -g nestjs/cli验证安装是否成功nest --version2.2 项目初始化创建新项目有两种方式交互式创建推荐新手nest newCLI会询问项目名称、包管理器选择等信息直接创建nest new my-project我更喜欢加上--strict参数启用TypeScript严格模式nest new my-project --strict2.3 项目结构解析生成的项目包含以下核心目录和文件my-project/ ├── src/ │ ├── app.controller.ts │ ├── app.module.ts │ ├── app.service.ts │ └── main.ts ├── test/ ├── nest-cli.json ├── package.json ├── tsconfig.json └── README.md其中nest-cli.json是CLI的配置文件可以自定义源代码目录编译输出目录生成文件的模板等3. CLI生成的核心文件详解3.1 入口文件main.ts这个文件相当于Vue项目的main.js是应用的启动入口import { NestFactory } from nestjs/core; import { AppModule } from ./app.module; async function bootstrap() { const app await NestFactory.create(AppModule); await app.listen(3000); } bootstrap();NestFactory.create()方法会创建Nest应用实例初始化所有模块依赖设置全局管道、过滤器、拦截器等我经常在这里添加全局中间件app.use(loggerMiddleware);3.2 控制器(Controller)生成的app.controller.ts演示了最基本的REST端点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(); } }实际项目中我通常会添加路由前缀Controller(api)使用DTO验证请求参数添加Swagger文档装饰器3.3 服务(Service)app.service.ts是业务逻辑的存放地import { Injectable } from nestjs/common; Injectable() export class AppService { getHello(): string { return Hello World!; } }Injectable()装饰器让这个类可以被依赖注入系统管理。我在这里通常会连接数据库调用外部API实现核心业务逻辑4. CLI的高级用法4.1 生成新模块开发中我经常需要添加新功能模块nest generate module users nest generate controller users nest generate service users更简洁的写法nest g mo users nest g co users nest g s users4.2 自定义模板CLI允许修改生成文件的模板。在项目根目录创建template文件夹然后修改nest-cli.json{ generateOptions: { spec: false, template: ./template } }我通常会自定义添加统一的版权注释预置常用的导入语句设置默认的类命名规范4.3 项目构建与部署CLI内置了构建命令nest build这会编译TypeScript代码输出到dist目录保留所有非TS资源文件生产环境启动npm run start:prod我通常会配合PM2进行进程管理pm2 start dist/main.js --name my-nest-app5. 常见问题与解决方案5.1 热更新失效如果发现修改代码后没有自动重新编译检查是否运行的是start:dev脚本确保没有手动修改node_modules尝试删除.cache文件夹后重启5.2 依赖注入错误遇到Nest cant resolve dependencies错误时检查相关Provider是否添加了Injectable()确认模块中正确导入了所有依赖查看循环依赖问题5.3 性能优化建议对于大型项目启用--webpack标志加速热更新nest start --watch --webpack使用SWC替代TypeScript编译器合理使用懒加载模块从手动创建到CLI工具我节省了至少70%的项目初始化时间。特别是在团队协作时CLI确保所有人的项目结构保持一致减少了大量沟通成本。当你熟悉基础用法后可以进一步探索nest-cli.json的配置选项打造更适合自己团队的开发工作流