安装React Native组件库时第三方依赖未自动安装原因排查
首先明确包管理器的基础行为:
放在
peerDependencies中的依赖不会被npm 6、yarn 1.x及更早版本自动安装,这是规范设计,不是配置错误。npm 7+虽然默认安装peer依赖,但涉及RN原生模块的场景本来就要求宿主环境持有单例依赖,原生依赖本身就应该声明在peerDependencies而非普通dependencies中。如果已经把依赖放在
dependencies中依然没有自动安装,90%的情况是发布流程配置错误,按以下顺序排查:先检查安装后宿主项目
node_modules/<你的组件库名>/package.json文件内容
确认你看到的dependencies配置和你本地源码里写的一致。绝大多数这类问题都是构建发布时的配置错了:比如构建产物输出到lib/dist目录时,没有把根目录正确的package.json复制到产物目录,或是.npmignore配置错误排除了package.json,或是files字段配置漏了package.json,导致发布到npm的包本身就没有声明对应依赖,自然不会触发安装。
发布前可以先在组件库目录执行npm pack生成本地压缩包,解压后检查包内的package.json配置是否正确,确认无误再发布。本地测试场景的特殊问题
如果你是用npm link/yarn link或者本地file路径做组件库联调测试,部分包管理器的link模式不会自动拉取链接包的依赖,这种场景要么在组件库目录先执行npm install装好自身依赖,要么直接用npm pack生成的tgz包在宿主项目安装测试,和真实发布后的行为一致。RN原生依赖的正确配置参考
对于lottie这类带原生代码的RN依赖,不要放在普通dependencies中,避免出现多实例冲突、原生链接重复的问题,推荐配置如下:"peerDependencies": { "react": "*", "react-native": "*", "lottie-ios": "3.2.3", "lottie-react-native": "^5.1.3" }, "peerDependenciesMeta": { "lottie-ios": { "optional": false }, "lottie-react-native": { "optional": false } }如果你需要兼容npm 6、yarn 1.x的用户,直接在组件库的README文档中明确标注需要手动安装的peer依赖即可,这也是目前绝大多数开源RN组件库的通用做法。
内容的提问来源于stack exchange,提问作者JSharles

