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

NestJS通过IISNode部署至IIS是否需保留服务器node_modules文件夹

NestJS IIS部署依赖问题解答

1. 直接部署原生dist目录时是否必须保留node_modules?

默认构建流程下确实需要,但你现在250MB+的node_modules体积存在大量冗余。
NestJS默认用TypeScript编译器做代码转译,不会处理node_modules里的第三方依赖,编译后的dist文件里所有类似require('@nestjs/core')的导入语句会原封不动保留,运行时会按Node.js的模块查找规则去上级目录找node_modules里的对应包,这也是你最开始报模块找不到错误的直接原因。
你不需要在服务器安装全量依赖,只保留生产依赖就能把体积压缩到原来的1/3甚至更小,操作逻辑完全兼容IISNode:

  • 上传到服务器的文件只需要包含dist目录、package.json、对应包管理器的锁文件(package-lock.json/pnpm-lock.yaml/yarn.lock)
  • 服务器上执行npm ci --omit=dev(低版本npm用npm install --production),只会安装运行时必需的生产依赖,不会安装typescript、lint工具、测试框架这类开发依赖,最终node_modules体积通常能控制在50-80MB区间。

2. 是否有方案让dist内置所有依赖,无需额外部署node_modules?

有成熟可行的方案,本质和Angular的构建逻辑一致,做应用级打包把所有依赖的运行时代码合并到构建产物里,目前生产环境常用两种实现路径:

  • 用NestJS CLI原生的打包能力:NestJS 9及以上版本内置了基于esbuild的打包功能,你只需要在执行构建命令时加--bundle参数,或者在nest-cli.json的compilerOptions里开启"bundle": true配置,构建出来的dist目录会生成单文件入口,所有依赖代码都已经内置,直接用node main.js就能启动,不需要任何外部node_modules。如果项目用到了bcrypt、sqlite3这类带C++原生扩展的依赖,只需要把这类包加到打包配置的external列表里即可。
  • 用Node.js单文件打包工具:可以用esbuild、pkg、nexe这类工具自定义打包规则,不仅能把所有依赖打进产物,甚至可以把Node.js运行时一起打包成独立exe文件,服务器上不需要提前安装Node.js,也不需要依赖IISNode,直接把exe配成IIS反向代理的后端服务即可,部署和运维成本更低。

实际选型建议:如果追求稳定零配置,优先选生产依赖安装的方案,几乎不会踩坑;如果对部署体积、发布流程简洁度有要求,再选打包方案,第一次配置时需要针对项目用到的动态加载模块、原生扩展做少量规则调整,配置完成后后续发布只需要传构建产物即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:00:51