npm/yarn link 测试包时报错 Warning: Invalid hook call. Hooks can only be called ...

简介: npm/yarn link 测试包时报错 Warning: Invalid hook call. Hooks can only be called ...

  • 使用 dumi 开发 React组件库时,为避免每次修改都发布到 npm,需要在本地的测试项目中使用 npm link 为组件库建立软连接,方便本地调试。
  • 结果在本地测试项目使用 $ npm link 组件库 后,使用内部组件确报错:
react.development.js:209 Warning: 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
See https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem.
  • 报错信息中提供了三种可能的原因,针对这三个可能原因逐一检查:


  1. React Hooks 是 React 16.8.0 版本中引入的,先检查 react 和 react-dom 的版本。发现是高于 16.8.0 的,支持 React Hook。排除
  2. 检查是否违背了调用 hook 的规则。然而组件中并未使用 hook,但是依赖的第三方库使用了 hook,并且使用方式是正确的;排除
  3. 检查项目中是否存在多个不同版本的 react 。发现测试项目和组件库中都存在 react 依赖,但是组件库中的 package.json 中已经将 react 和 react-dom 都添加到了 peerDependencies 属性中。待定


  • 极有可能是因为第三条导致了问题,继续查阅文档,官网 在此处 给出过可能的原因。


This problem can also come up when you use npm link or an equivalent. In that case, your bundler might “see” two Reacts — one in application folder and one in your library folder. Assuming myapp and mylib are sibling folders, one possible fix is to run npm link …/myapp/node_modules/react from mylib. This should make the library use the application’s React copy.


已经基本确定是由于 npm link 引发了问题,猜测使用 npm link 时,不会忽略 package.json 中的 peerDependencies 选项,而组件库中 react 版本依赖都存放在这个选项内。


bc96d67279ba51e13140ea84846f4ed1_21531362edc69e519b0638d322bb8e4e.png


  • 解决方案

例如:组件库项目根路径(/Users/xxx/Desktop/design)、测试项目根路径(/Users/xxx/Desktop/testlink)。


在 测试项目 中软链接 组件库项目 中安装的 react 版本即可,如果还未解决,再将 react-dom 也进行软链接到测试项目。

# 1、进入测试项目
$ cd /Users/xxx/Desktop/testlink
# 2、软链接组件库中安装的 react 版本
$ npm link /Users/xxx/Desktop/design/node_modules/react
# (备用)如果还是报错,可在链接 react-dom,但是一般不需要,link react 基本也就解决了。
$ npm link /Users/xxx/Desktop/design/node_modules/react-dom
# 3、重新跑测试项目,确保组件库项目包正确,可以重新打包,在到测试项目中 link 组件库包,并重启测试测试项目。

还有个解决方案:删除组件库项目 node_modules 文件夹内的 react 包也可以解决,原理都一样,两者存在一个版本的 react 包即可,但是这种方式不推荐,毕竟删了打包组件库时就报错了,还得重新 npm i 安装依赖。


相关文章
|
1月前
|
Java Android开发
Rockchip系列之CAN APP测试应用实现(4)
Rockchip系列之CAN APP测试应用实现(4)
31 1
|
1月前
|
资源调度 JavaScript Linux
nvm, node.js, npm, yarn 安装配置
nvm, node.js, npm, yarn 安装配置
79 1
|
26天前
|
前端开发 JavaScript 数据安全/隐私保护
从0到1开发一个自己的npm包完整过程
创建自己的 npm 包涉及六个步骤:1) 注册 npm 账号;2) 使用 `npm init` 初始化项目,确保 package.json 的 name 唯一且 private 为 false;3) 开发项目,可封装 UI 组件、函数库或命令行工具;4) 本地调试,通过 `npm link` 在项目中测试;5) `npm login` 登录账号,可能需切换至官方仓库;6) 使用 `npm publish` 发布项目。注意版本号递增,无意义的包不建议发布。
34 2
从0到1开发一个自己的npm包完整过程
|
9天前
|
资源调度
npm yarn 启动报错【已解决】
npm yarn 启动报错【已解决】
15 2
|
28天前
|
JSON 小程序 前端开发
小程序中使用npm安装vant组件实现按需引入减少代码包大小,避免触发用户隐私协议
微信小程序按需引入 vant 组件,自动清除项目中未使用的 vant 组件,减少代码包大小,避免因未使用到的 vant 组件触发隐私协议提交审核时被拒
34 1
小程序中使用npm安装vant组件实现按需引入减少代码包大小,避免触发用户隐私协议
|
14天前
|
存储 缓存 资源调度
你真的知道 NPM、Yarn 与 PNPM 这三个前端包管理器之间的区别吗?
【6月更文挑战第9天】NPM、Yarn和PNPM是主流前端包管理器,各有特色。NPM生态庞大,易用但速度慢;Yarn速度快,依赖管理稳定;PNPM性能优异,节省磁盘空间。Yarn和PNPM在速度和确定性上胜出,NPM因广泛使用和丰富资源领先。开发者可根据项目需求和喜好选择,三者共同推动前端开发进步。
27 8
|
5天前
|
存储 缓存 资源调度
npm、yarn与pnpm详解
npm、yarn与pnpm详解
16 0
|
8天前
|
安全 JavaScript 前端开发
怎么发布npm包?
该文介绍了如何在JavaScript环境中发布npm包的步骤。首先,确保npm客户端配置使用官方源,以避免安全和兼容性问题。接着,登录npm账号。然后,检查`package.json`文件,其中包的`name`应唯一,版本号遵循语义化版本控制。更新版本号后,使用`npm publish`发布包。最后,通过在新环境中全局安装并测试包来验证发布是否成功
|
29天前
|
Android开发 数据安全/隐私保护 iOS开发
ios和安卓测试包发布网站http://fir.im的注册与常用功能
ios和安卓测试包发布网站http://fir.im的注册与常用功能
24 0
ios和安卓测试包发布网站http://fir.im的注册与常用功能
|
1月前
|
存储 资源调度 JavaScript
pnpm、npm、yarn是什么?怎么选择?
pnpm、npm、yarn是什么?怎么选择?
33 2

推荐镜像

更多