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
相关产品推荐
相关产品推荐

