在树莓派等单板计算机上部署NestJS项目的依赖问题咨询
执行nest build时,Nest CLI只会将开发者编写的TypeScript业务代码编译为JavaScript输出到dist目录,不会把@nestjs/core等第三方依赖打包进编译产物,因此仅迁移dist目录启动时,Node会因找不到依赖模块抛出报错。
不需要迁移src源码目录、TS配置、ESLint配置、测试用例等开发阶段文件,仅需同步以下内容到树莓派:
nest build生成的完整dist目录- 项目根目录的
package.json - 依赖锁文件:使用npm对应
package-lock.json、yarn对应yarn.lock、pnpm对应pnpm-lock.yaml - 运行时依赖的非代码资源:比如生产环境
.env配置文件、自定义的json/yaml配置、静态资源目录等,这类文件不会被编译进dist目录
你遇到的800M体积是包含了devDependencies开发依赖的全量node_modules大小,生产环境完全不需要安装这类开发阶段的工具包,可根据需求选以下方案:
方案1:生产环境精简依赖安装
将上述最小文件清单上传到树莓派后,在项目根目录执行对应包管理器的生产依赖安装命令即可:
- npm执行:
npm ci --omit=dev(旧版npm可使用npm install --production) - yarn执行:
yarn install --production - pnpm执行:
pnpm install --prod
该命令会自动跳过所有开发依赖(包括TypeScript、Nest CLI、代码检查工具、测试工具等占空间的包),仅安装运行必需的生产依赖,最终node_modules体积通常仅为全量安装的20%-40%,大部分NestJS项目的生产依赖体积在100M-200M区间,远低于800M。
方案2:单文件打包(完全无需在树莓派安装node_modules)
可以在本地构建阶段将所有生产依赖和业务代码打包为单个独立JS文件,部署时仅需传输单文件+运行时配置即可启动,全程不需要在树莓派安装任何依赖:
- 本地开发环境安装打包工具:
npm i -D @vercel/ncc - 在
package.json的scripts字段中新增生产打包命令:
"build:pi": "nest build && ncc build dist/main.js -o dist-pi --minify"
- 本地执行
npm run build:pi,生成的dist-pi目录下的index.js就是包含所有依赖的压缩后单文件,整体体积通常仅为10M-50M - 将
index.js和你的运行时配置文件(比如生产环境.env)传到树莓派,直接执行node index.js即可启动服务
注意:如果项目依赖了带系统原生二进制的包(比如bcrypt、sharp等),建议直接在树莓派同架构环境下执行打包,避免跨架构打包导致原生依赖运行异常。
方案3:本地预构建精简依赖直接传输
如果你本地开发机和树莓派的系统架构、Node大版本完全一致(比如都是arm64架构、Node 18.x版本),可以直接在本地提前安装好精简生产依赖,随其他文件一起传输,省去树莓派上的依赖安装步骤:
- 本地项目根目录执行
npm ci --omit=dev安装生产依赖 - 将生成的精简版node_modules目录、dist目录、package.json、运行时配置一并传到树莓派
- 直接执行
node dist/main即可启动
注意:不要直接传输本地开发环境带devDependencies的全量node_modules,不仅体积大,跨架构传输时原生依赖会直接运行报错。
内容的提问来源于stack exchange,提问作者Davide Ferrero

