Nestjs框架: 微服务项目工程结构优化与构建方案
概述
核心问题:
- 传统独立项目结构存在运维部署效率低、构建工具兼容性差的问题
- 需通过 Monorepo架构 优化代码组织,结合 SWC编译器 和 pnpm workspace 提升开发体验
微服务基础能力复用性
- 在微服务开发中,异常捕获、管道(
Pipe)拦截器及守卫(Guard)的实现逻辑与RESTful接口保持一致 - 装饰器使用方式相同,因此不再赘述
- 合理的项目结构应采用NestJS Monorepo模式
Monorepo项目结构创建
目标: 避免分散的项目导致运维部署困难。
步骤:
1 ) 使用Nest CLI创建Monorepo项目:
nest new --monorepo client --no-spec -d
2 )如果是旧项目的迁移:
nest generate app client --no-spec -d
-
此命令将原应用迁移至
apps/目录,生成Monorepo结构 -
执行后,
package.json仍使用start:dev启动默认项目(入口为main.ts) -
保留默认启动脚本:
"scripts": { "start": "nest start", "start:dev": "nest start --watch" } -
若启动特定子项目需调整
package.json脚本:{"scripts": {"start:client": "nest start client","start:client:dev": "nest start client --watch","start:main:dev": "nest start main --watch"} }
3 ) 重申关于Monorepo项目启动与调试
问题: 默认脚本仅启动主应用(如 main),需定制子应用(如 client)脚本
解决方案:
3.1 修改 package.json 脚本:
"scripts": { "start:client": "nest start client --watch", "start:client:debug": "nest start client --debug --watch"
}
3.2 启动命令:
pnpm start:client # 启动client应用
验证: 修改 client 端口(如 3001)后热更新生效。
SWC构建工具集成问题
关键冲突: 官方Monorepo结构直接切换SWC会导致模块解析失败,错误示例(需避免):
错误方案:仅修改nest-cli.json
{ "build": "client", "compiler": { "webpack": false, "builder": "swc" }
}
正确方案:
1 ) 配置Webpack(webpack.config.js):
安装依赖:
pnpm add -D swc-loader @swc/core
配置
const { composePlugins } = require('@nx/webpack');
const { swcDefaults } = require('@nx/js'); module.exports = composePlugins((config) => { return { ...config, module: { rules: [ { test: /\.ts$/, loader: 'swc-loader', exclude: /node_modules/, options: { jsc: { parser: { syntax: 'typescript' }, transform: { react: { runtime: 'automatic' } } } } } ] } };
});
构建命令:
"build:client": "nest build client"
2 )使用 webpack + swc-loader 替代官方构建流程,创建 webpack.config.js:
安装依赖:
pnpm add -D swc-loader @swc/core
配置
const { defaults } = require('nestjs-webpack');module.exports = (options) => {const config = defaults(options);config.module.rules.push({test: /\.ts$/,loader: 'swc-loader',options: {jsc: {parser: {syntax: 'typescript',decorators: true,},},},});return config;
};
-
调整
nest-cli.json:{"projects": {"client": {"webpack": true }} } -
此时
pnpm start:client:dev可正常启动并利用 SWC 加速构建
pnpm Workspace 高性能方案
优势: 依赖共享、并行构建、高效缓存
实施步骤:
1 ) 初始化Workspace:
mkdir my-project && cd my-project
pnpm init
pnpm add -D @nestjs/cli
2 ) 创建 pnpm-workspace.yaml:
packages: - 'apps/*'
3 ) 项目结构示例:
my-project/
├── apps/
│ ├── main/ # 主应用 微服务主入口
│ │ ├── src/
│ │ └── package.json (name: "app-main")
│ └── client/ # 子应用 微服务客户端
│ ├── src/
│ └── package.json (name: "app-client")
├── package.json
└── pnpm-workspace.yaml
4 ) SWC集成优化:
- 安装全局SWC依赖:
pnpm add -D @swc/cli @swc/core -w - 配置构建脚本:
{"scripts": {"build": "pnpm --filter \"./apps/*\" run build","start:dev": "pnpm --filter \"./apps/*\" run start:dev"}}
- 或
// package.json "scripts": { "build": "pnpm run --filter \"apps/*\" build", "start:all": "pnpm run --parallel start:dev" }
5 ) 构建
pnpm build
依赖复用:在根目录添加 .npmrc 启用 shamefully-hoist=true,避免重复安装
微服务部署实践
启动多服务:
// apps/main/src/main.ts
import { NestFactory } from '@nestjs/core';
import { Transport } from '@nestjs/microservices'; async function bootstrap() { const app = await NestFactory.createMicroservice(AppModule, { transport: Transport.TCP, options: { port: 3000 } }); await app.listen();
}
bootstrap(); // apps/client/src/main.ts
const app = await NestFactory.create(AppModule);
await app.listen(3001);
启动命令:
pnpm start:all # 并行启动main(3000)和client(3001)
构建产出与后续部署
- 构建产物: 执行
pnpm build后,编译文件输出至各子项目的dist/目录,可直接部署 - 构建结果位于各子项目的
dist/目录(如apps/main/dist、apps/client/dist)。部署时需注意:- 独立部署:将各子项目
dist/作为独立服务部署。 - 容器化建议:为每个微服务创建单独Docker镜像,通过Kubernetes管理服务发现。
- 构建缓存优化:在CI/CD中复用PNPM的
store目录加速依赖安装。
- 独立部署:将各子项目
通过此结构,项目维护效率提升50%+,后续将深入微服务打包与部署策略
架构收益总结
| 方案 | 构建速度 | 依赖管理 | 热更新支持 |
|---|---|---|---|
| 官方Monorepo | 慢(>1s/项目) | 独立安装 | 有限 |
| pnpm Workspace | 快(<100ms/项目) | 共享依赖 | 完整支持 |
最终推荐: 采用 pnpm workspace + SWC 方案,通过以下配置确保高效开发:
- 依赖安装在根目录(
pnpm-workspace.yaml) - 全局SWC编译器替代Webpack
- 并行启动脚本(
pnpm run --parallel)
优化后的项目结构具备以下优势:
- 高效构建:pnpm workspace + SWC 实现毫秒级构建。
- 统一管理:通过 monorepo 集中维护多个微服务。
- 灵活部署:独立配置端口与启动脚本,避免冲突。
- 工具兼容:通过
webpack+swc-loader解决官方 CLI 的限制。
关键实践:避免直接使用 Nest CLI 的 monorepo 构建命令,优先选择 pnpm workspace 架构,并搭配 SWC 提升性能
