使用react-native-builder-bob构建的自定义React Native工具包通过npm安装时出现TS组件错误,Yarn构建正常
看起来你遇到的问题是npm和yarn在依赖解析、peer依赖处理上的差异导致的,尤其是从GitHub安装包时,npm会执行prepare脚本但可能拉取了不兼容的类型依赖,引发TS错误。下面是几个针对性的解决方案,你可以一步步尝试:
1. 锁定Peer依赖版本,避免版本漂移
你的package.json里peerDependencies用了*,这会允许npm安装任何版本的react/react-native,很容易和你项目里的17.0.2/0.68.2版本不兼容,导致类型冲突。把peerDependencies改成和项目匹配的范围:
"peerDependencies": { "react": "^17.0.0", "react-native": "^0.68.0", "react-native-svg": "^13.0.0" }
这样npm安装时会确保依赖版本和你的项目一致,避免类型不匹配。
2. 强制项目依赖的类型包版本(npm专属)
npm的依赖解析可能会拉取工具包依赖树里的高版本@types/react/@types/react-native,和你项目的版本冲突。你可以在项目的package.json里添加overrides字段,强制锁定这些类型包的版本:
"overrides": { "@types/react": "17.0.21", "@types/react-native": "0.68.0" }
这个配置会让npm在安装所有依赖时,都使用指定的类型版本,解决跨包的类型冲突。
3. 检查react-native-builder-bob的构建配置
确保你的tsconfig.build.json配置正确,能生成完整的类型定义:
- 确认
compilerOptions里的declaration: true,并且declarationDir指向lib/typescript(和package.json里的types字段对应) - 确保tsconfig里的
jsx设置为react-native,因为React Native的JSX语法和Web不同 - 手动运行
npm run build,检查lib/typescript目录下是否生成了正确的.d.ts文件,尤其是CloseButton相关的类型
4. 清理npm缓存,重新安装
有时候npm缓存的旧依赖会导致奇怪的问题,执行以下步骤:
- 删除项目的
node_modules目录和package-lock.json - 运行
npm cache clean --force清除缓存 - 重新执行
npm install安装依赖
5. 确认GitHub安装时的构建流程
当从GitHub安装包时,npm会自动执行package.json里的prepare脚本(也就是bob build)。你可以在本地模拟这个流程:
- 克隆你的工具包仓库到本地
- 执行
npm install然后npm run prepare - 检查生成的
lib文件夹是否正常,没有类型错误
如果构建后有错误,那说明是构建脚本的问题,需要调整bob的配置或者tsconfig
这类问题大多是依赖版本不匹配导致的类型冲突,锁定peer依赖和强制类型版本是最常见的解决方法。如果还是不行,可以考虑升级node版本(你的v14.21.2相对较旧,npm9和node14可能存在兼容性问题)。
备注:内容来源于stack exchange,提问作者menaka

