You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PNPM Workspaces配置:NestJS如何实现依赖包热重载?

问题描述

项目结构:

apps
  - application1
  - application2
packages
  - @my-project/package1
  - @my-project/package2
  - @my-project/package3

PNPM Workspace配置文件(pnpm-workspace.yaml):

packages:
  - 'apps/**/*'
  - 'packages/**/*'

应用通过workspace:*引用内部包(package.json示例):

{
  "dependencies": {
    "@my-project/package1": "workspace:*",
    "@my-project/package2": "workspace:*",
    "@my-project/package3": "workspace:*"
  } 
}

当前应用运行正常,但NestJS后端服务在修改packages下的代码时,必须停止服务、重装依赖并重启才能生效;修改自身代码时热重载正常。需实现packages代码变更时自动构建并让应用感知。

解决方案

1. 为内部包配置自动构建监听

在每个packages/@my-project/*的package.json中添加带watch模式的构建脚本(以TypeScript项目为例):

{
  "scripts": {
    "build": "tsc",
    "build:watch": "tsc --watch"
  }
}

同时确保每个包的tsconfig.json配置了正确的outDir(比如dist目录),并在包的package.json中通过main字段指定产物入口,例如:"main": "dist/index.js"。

2. 统一启动所有监听任务

在根目录的package.json中添加并行执行脚本,同时启动内部包的watch构建和NestJS应用的热重载:

{
  "scripts": {
    "dev:packages": "pnpm --filter \"./packages/**\" run build:watch",
    "dev:app": "pnpm --filter \"application1\" start:dev",
    "dev": "pnpm run dev:packages & pnpm run dev:app"
  }
}

如果是Windows环境,建议使用concurrently包替代&来实现并行任务,避免终端兼容性问题。

3. 调整NestJS热重载范围

默认NestJS热重载不会监听node_modules目录,但PNPM Workspace中内部包通过软链接关联到该目录,需修改配置让应用监听内部包的变化:

  • 修改应用的nest-cli.json:
{
  "compilerOptions": {
    "watchAssets": true,
    "watchIgnorePatterns": ["node_modules/(?!@my-project)"]
  }
}
  • 或直接在启动脚本中指定参数:
{
  "scripts": {
    "start:dev": "nest start --watch --watchAssets --watchIgnorePatterns \"node_modules/(?!@my-project)\""
  }
}

该配置会让NestJS忽略node_modules中除@my-project外的其他包,只监听内部包的文件变更。

4. 确保PNPM软链接正确

如果之前依赖安装未创建正确的软链接,重新执行以下命令修复:

pnpm install

PNPM默认会在workspace中为内部包创建软链接,确保应用能直接引用到包的最新构建产物。

内容的提问来源于stack exchange,提问作者napfernandes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 16:27:15