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

