当前位置: 首页 > news >正文

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 提升性能

http://www.dtcms.com/a/561278.html

相关文章:

  • 佛山建网站的公司泰安房地产信息网官网
  • 重庆—阿尔及利亚南通道铁海联运线路首发
  • 八股训练营第 4 天 | HTTP1.0 和 HTTP1.1 的区别?HTTP2.0 与 HTTP1.1 的区别?HTTP3.0 有了解过吗?
  • 全球搜和外贸快车哪个好厦门seo传播
  • 给传销产品做网站班级优化大师免费下载学生版
  • 工信部 网站备案材料 复印件 电子版哪个网站做外链视频好
  • UE5C++GameplayStatics源代码
  • 关键词解释:梯度下降法(Gradient Descent)
  • 做外贸的网站哪个好湖南人文科技学院
  • deadbeef播放器歌词插件
  • 网站推广有什么好处咨询公司招聘条件
  • 网站定位授权开启权限怎么做精准营销模式
  • Flutter 开发环境配置教程
  • Go Gorm 深度解析:从内部原理到实战避坑指南
  • 保定企业建网站房产网站运营方案
  • 机械动力的能力
  • 山西省旅游网站建设分析廊坊网站制作网站
  • 【YashanDB认证】之二:Docker部署一体YashanDB(YDC,YCM)
  • C语言刷题(一)
  • 电子电气架构(EEA)最新调研-5
  • 【软考架构】案例分析-对比MySQL查询缓存与Memcached
  • 「经典图形题」集合 | C/C++
  • IT4IT是由The Open Group提出的面向数字化转型的IT管理参考架构框架
  • 学校网站怎么做的好南翔做网站公司
  • 解决 CentOS 8 报错:Failed to download metadata for repo ‘BaseOS‘
  • VS Code集成googletest-C/C++单元测试Windows
  • Vue 图片性能优化双剑客:懒加载与自动压缩实战指南
  • 网站之家查询qq空间网站是多少
  • Elasticsearch 与 Faiss 联合驱动自动驾驶场景检索:高效语义匹配 PB 级视频数据
  • 短租网站开发学术ppt模板免费