完整教程: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/distapps/client/dist)。部署时需注意:
    • 独立部署:将各子项目dist/作为独立服务部署。
    • 容器化建议:为每个微服务创建单独Docker镜像,通过Kubernetes管理服务发现。
    • 构建缓存优化:在CI/CD中复用PNPM的store目录加速依赖安装。

通过此结构,项目维护效率提升50%+,后续将深入微服务打包与部署策略

架构收益总结


方案构建速度依赖管理热更新支持
官方Monorepo慢(>1s/项目)独立安装有限
pnpm Workspace快(<100ms/项目)共享依赖完整支持

最终推荐: 采用 pnpm workspace + SWC 方案,通过以下配置确保高效开发:

  1. 依赖安装在根目录(pnpm-workspace.yaml
  2. 全局SWC编译器替代Webpack
  3. 并行启动脚本(pnpm run --parallel

优化后的项目结构具备以下优势:

  1. 高效构建:pnpm workspace + SWC 实现毫秒级构建。
  2. 统一管理:通过 monorepo 集中维护多个微服务。
  3. 灵活部署:独立配置端口与启动脚本,避免冲突。
  4. 工具兼容:通过 webpack + swc-loader 解决官方 CLI 的限制。

关键实践:避免直接使用 Nest CLI 的 monorepo 构建命令,优先选择 pnpm workspace 架构,并搭配 SWC 提升性能

posted @ 2025-12-02 21:28  gccbuaa  阅读(41)  评论(0)    收藏  举报