在使用react hook时,相信不少人会碰到报如下错误的:
1 2 3 4 |
Error: Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons: 1. You might have mismatching versions of React and the renderer (such as React DOM) 2. You might be breaking the Rules of Hooks 3. You might have more than one copy of React in the same app |
引起此错误的是会有很多场景,抛开前二点因素因为也比较容易解决,而此次总结出现比较频率及比较难解决的第三点,不允许react有多个实例情况。
这种情况会在什么时候下复现呢?
1、制作react hook组件sdk时,使用npm link软链接插件
2、第三方插件dependencies依赖内还存在react版本,并且与主项目react版本不一致
解决方案总结
npm link软链接解决方案
注意:sdk插件和调试的项目,二者之间必须是同父级主目录,
- 进入react hook组件的sdk项目,在终端输入
npm link
,常规软链接操作 - 把sdk插件项目内的react进行软链接,就是把sdk内的react指向调试项目内的node_modules/react包。
1 |
npm link ../use-component-project/node_modules/react |
案例示例:
1 2 3 |
# 进入vgeform项目后,把vgeform内的react指向fig-spa项目内的react cd ./vgeform npm link ../fig-spa/node_modules/react |
- 进入调试项目内,进行软链接本地包
npm link vgeform
,此时就可以正常使用了。
PS:第二步操作一定要指向你调试项目内的react包,如果像上面你指向fig-spa的react版本后,你却去其它项目软链接vgeform那是没有用的!!一定要流程流程细节。
第三方插件dependencies版本不一致
像第三方插件或是自己内部插件的sdk插件导致版本不一致情况,如果不能改动插件内部的话,可以通过以下方式强制react统一。
- 进行项目内,修改package.json文件,添加resolutions参数,强制所有包都指定一个react版本,
1 2 3 4 5 6 7 |
{ // 忽略其它参数 "resolutions": { "**/react": "17.0.1", "**/react-dom": "17.0.1" }, } |
-
删除项目内本地 lock文件,以及node_modules文件夹
-
在项目内使用yarn安装包,因为在package.json文件中,resolutions 这个参数只有yarn才支持,npm安装是不生效的
1 2 |
cd use-component-project # 进入项目内 yarn # 安装包 |
PS:此方式不支持npm link软链接的哦,是会报错的,所以如果你是本地软链接react hook组件的话,还是用npm link的解决方案。