Nestjs框架: 微服务项目工程结构优化与构建方案

概述

核心问题:

  • 传统独立项目结构存在运维部署效率低、构建工具兼容性差的问题
  • 需通过 Monorepo架构 优化代码组织,结合 SWC编译器 和 pnpm workspace 提升开发体验

微服务基础能力复用性

  • 在微服务开发中,异常捕获、管道(Pipe)拦截器及守卫(Guard)的实现逻辑与RESTful接口保持一致
  • 装饰器使用方式相同,因此不再赘述
  • 合理的项目结构应采用NestJS Monorepo模式

Monorepo项目结构创建

目标: 避免分散的项目导致运维部署困难。

步骤:

1 ) 使用Nest CLI创建Monorepo项目:

bash 复制代码
nest new --monorepo client --no-spec -d  

2 )如果是旧项目的迁移:

bash 复制代码
nest generate app client --no-spec -d 
  • 此命令将原应用迁移至apps/目录,生成Monorepo结构

  • 执行后,package.json仍使用start:dev启动默认项目(入口为main.ts

  • 保留默认启动脚本:

    json 复制代码
    "scripts": {  
      "start": "nest start",  
      "start:dev": "nest start --watch"  
    }  
  • 若启动特定子项目需调整package.json脚本:

    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 脚本:

json 复制代码
"scripts": {  
  "start:client": "nest start client --watch",  
  "start:client:debug": "nest start client --debug --watch"  
}  

3.2 启动命令:

bash 复制代码
pnpm start:client  # 启动client应用  

验证: 修改 client 端口(如 3001)后热更新生效。

SWC构建工具集成问题

关键冲突: 官方Monorepo结构直接切换SWC会导致模块解析失败,错误示例(需避免):

bash 复制代码
错误方案:仅修改nest-cli.json  
{  
  "build": "client",  
  "compiler": {  
    "webpack": false,  
    "builder": "swc"  
  }  
}  

正确方案:

1 ) 配置Webpack(webpack.config.js):

安装依赖:

bash 复制代码
pnpm add -D swc-loader @swc/core  

配置

ts 复制代码
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' } }  
            }  
          }  
        }  
      ]  
    }  
  };  
});  

构建命令:

json 复制代码
"build:client": "nest build client"  

2 )使用 webpack + swc-loader 替代官方构建流程,创建 webpack.config.js

安装依赖:

bash 复制代码
pnpm add -D swc-loader @swc/core 

配置

ts 复制代码
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

    json 复制代码
    {
     "projects": {
       "client": {
         "webpack": true 
       }
     }
    }
  • 此时 pnpm start:client:dev 可正常启动并利用 SWC 加速构建

pnpm Workspace 高性能方案

优势: 依赖共享、并行构建、高效缓存

实施步骤:

1 ) 初始化Workspace:

bash 复制代码
mkdir my-project && cd my-project  
pnpm init  
pnpm add -D @nestjs/cli  

2 ) 创建 pnpm-workspace.yaml

yaml 复制代码
packages:  
  - 'apps/*'  

3 ) 项目结构示例:

tree 复制代码
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依赖:

    bash 复制代码
    pnpm add -D @swc/cli @swc/core -w  
  • 配置构建脚本:

json 复制代码
   {
     "scripts": {
       "build": "pnpm --filter \"./apps/*\" run build",
       "start:dev": "pnpm --filter \"./apps/*\" run start:dev"
     }
   }
  • json 复制代码
     // package.json  
     "scripts": {  
       "build": "pnpm run --filter \"apps/*\" build",  
       "start:all": "pnpm run --parallel start:dev"   
     }  

5 ) 构建

bash 复制代码
pnpm build 

依赖复用:在根目录添加 .npmrc 启用 shamefully-hoist=true,避免重复安装

微服务部署实践

启动多服务:

json 复制代码
// 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);  

启动命令:

bash 复制代码
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 提升性能

相关推荐
摇滚侠3 分钟前
2025最新 SpringCloud 教程,编写微服务 API,笔记08
笔记·spring cloud·微服务
没头发的卓卓36 分钟前
新手入门:nest基本使用规则(适合零基础小白)
nestjs
7***31882 小时前
若依微服务中配置 MySQL + DM 多数据源
android·mysql·微服务
我是好小孩2 小时前
【Android】常见的架构模式:MVC, MCP, MVVM
android·架构·mvc
t***p9352 小时前
业务架构、数据架构、应用架构和技术架构
架构
一只爱喝果粒橙的程序员3 小时前
Spring Cloud分布式事务(基于Seata AT模式,集成Nacos)--学习版
微服务·seata·分布式事务
G***E3164 小时前
PHP微服务通信消息队列实践
微服务·云原生·架构
稚辉君.MCA_P8_Java4 小时前
通义 Go 语言实现的插入排序(Insertion Sort)
数据结构·后端·算法·架构·golang
语落心生4 小时前
探秘新一代向量存储格式Lance-format (十三) 数据更新与 Schema 演化
架构
语落心生4 小时前
探秘新一代向量存储格式Lance-format (八) Dataset 核心实现与生命周期
架构