Node.js使用外部公共文件 前后端共享TS类型时rxjs报错如何配置package.json
问题根因
common目录下的TS文件依赖rxjs,但该目录没有独立安装依赖,TS默认从当前文件所在目录向上查找node_modules,你目前rxjs只安装在server和client各自的私有node_modules目录下,common层级找不到对应依赖,就会抛出缺失报错。
解决方案
方案1:将common转为公共工作区包(推荐,适合长期维护)
这个方案是标准的monorepo多包复用架构,后续新增公共依赖、公共模块都更方便:
- 首先在项目根目录(prj目录)创建
package.json,开启workspaces配置:
{ "name": "project-root", "private": true, "workspaces": [ "./common", "./server", "./client" ] }
- 进入
common目录执行npm init -y生成独立的package.json,声明公共依赖:
{ "name": "@proj/common", "version": "1.0.0", "private": true, "dependencies": { "rxjs": "^7.0.0" // 版本和client、server中已安装的rxjs版本保持一致 } }
- 分别在
server/package.json和client/package.json的dependencies字段中添加公共包依赖:
"dependencies": { "@proj/common": "1.0.0" }
- 回到项目根目录执行
npm install,npm会自动把所有工作区的公共依赖提升到根目录node_modules,同时给各个子包建立软链接,common目录下的文件可以正常识别到rxjs依赖。 - 可选优化:在
server/tsconfig.json和client/tsconfig.json中添加路径别名,不用写超长相对路径引入公共文件:
"compilerOptions": { "baseUrl": "./", "paths": { "@common/*": ["../common/types/*"] } }
配置完成后可以直接用import { Someclass } from '@common/somefile'引入公共类型。
方案2:不改造架构,临时适配
如果不想调整为monorepo架构,可以直接修改TS配置让common文件优先查找当前子项目的依赖:
- 在
server/tsconfig.json和client/tsconfig.json中添加如下配置:
"compilerOptions": { "moduleResolution": "node", "paths": { "rxjs": ["./node_modules/rxjs"] } }, "include": [ "src/**/*", "../common/**/*" // 把common目录纳入当前项目的TS编译范围 ]
配置后common目录下的文件引入rxjs时,会直接映射到当前子项目node_modules下的rxjs包,不会再报缺失错误。
注意事项
- 要保证client、server、common用到的rxjs版本完全一致,避免出现类型不兼容问题
- 如果使用方案1,所有依赖安装操作建议在根目录执行,不要在子目录单独安装,避免重复装包
内容的提问来源于stack exchange,提问作者user1578679
相关产品推荐
相关产品推荐

