从Git安装npm依赖包时如何在npm install阶段自动编译TypeScript代码
问题根因
NestJS 默认的 TypeScript 编译逻辑仅会处理项目根目录src下的业务代码,即便你在tsconfig的include中添加了node_modules下的依赖路径,@nestjs/cli的内置构建规则也会跳过node_modules目录下的文件编译,因此无法识别未编译的纯TS依赖包。而Angular CLI的构建逻辑会自动处理node_modules中的TS类型文件,因此不会报错。
解决方案
方案1:改造公共类型包(最优方案,一劳永逸)
直接在你的myproject-types公共包中添加自动编译逻辑,安装时自动生成JS文件和类型声明,步骤如下:
- 在公共包的根目录添加tsconfig.json,示例配置:
{ "compilerOptions": { "module": "commonjs", "target": "es2017", "declaration": true, "outDir": "./dist", "rootDir": "./src" }, "include": ["src/**/*.ts"], "exclude": ["node_modules"] }
- 修改公共包的package.json,添加构建脚本和入口配置:
{ "name": "myproject-types", "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { "build": "tsc", "prepare": "npm run build" } }
说明:
prepare是npm的官方生命周期钩子,当你通过git地址安装该依赖时,npm会自动执行该钩子完成编译,直接在node_modules的包目录下生成dist文件夹和对应的JS、d.ts文件。
- 建议在公共包的src/index.ts中统一导出所有类型/枚举,后续业务项目引用时直接写
import { SessionEventEnum } from 'myproject-types'即可,不需要写内部路径避免报错。
方案2:不修改公共包,改造NestJS项目配置(临时兼容方案)
如果暂时无法修改公共类型包,可以在NestJS项目中添加 postinstall 钩子,安装依赖后自动编译该包:
- 修改NestJS项目的package.json,添加脚本:
{ "scripts": { "postinstall": "cd node_modules/myproject-types && npm install && tsc" } }
- 调整tsconfig.json的include规则,确保编译时能找到生成的JS文件,同时修改业务代码中的引用路径为编译后的dist路径,或者直接从包入口引用。
内容的提问来源于stack exchange,提问作者ben berizovsky
相关产品推荐
相关产品推荐

