为什么npm link后会有两个React?
来源:12-8 使用 npm link 本地测试组件库 第一部分

FDirector
2025-03-18
为什么npm link后会有两个React?
我们的组件库通过peerDependencie声明对React的依赖,这意味着vikingtest在npm install组件库的时候,仅会安装自己的React而不会安装组件库中的React?所以npm link为什么会报错说有两个React呢?而且为什么让组件库npm link vikingtest中的React就可以解决问题呢?
老师,我这里做出我自己的答案猜想,您看正确与否:
- npm install和npm link还不一样,npm link是将整个项目都创建符号链接,不受files限制。
- 我们组件库在开发过程中,没有删除组件库中的node_modules,而组件库的代码中有React,组件库的node_modules又被npm link过来,导致vikingtest在项目打包时由于node_module的引入就近原则,引入了组件库node_modules中的React,所以vikingtest的bundle里存在了第一份React。
- vikingtest也使用了React,但这个React是vikingtest的node_modules下的React,所以vikingtest的bundle里存在了第二份React。
写回答
1回答
-
同学你好
你的理解非常接近了 让我帮你完善一下这个解释:
你说得对的部分:
1 npm link 确实会创建整个项目的符号链接,不受 package.json 中 files 字段的限制
2 组件库的 node_modules 确实会被链接过来
3 模块解析的就近原则确实是关键因素之一
需要稍微修正的部分:
实际上不是 bundle 里有两份 React 的问题,而是运行时有两个 React 实例的问题。这是因为:
React 在运行时会维护一些内部状态(比如 hooks 的状态)
当代码中引用了两个不同路径的 React,就会创建两个独立的 React 实例
这两个实例之间的状态是互相隔离的,导致 hooks 等功能无法正常工作
012025-03-20
相似问题