当前位置: 首页 > news >正文

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 HooksReact 16.8.0 版本中引入的,先检查 reactreact-dom 的版本。发现是高于 16.8.0 的,支持 React Hook。排除

    2. 检查是否违背了调用 hook 的规则。然而组件中并未使用 hook,但是依赖的第三方库使用了 hook,并且使用方式是正确的;排除

    3. 检查项目中是否存在多个不同版本的 react 。发现测试项目和组件库中都存在 react 依赖,但是组件库中的 package.json 中已经将 reactreact-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 版本依赖都存放在这个选项内。

    image.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 安装依赖。

http://www.lryc.cn/news/157207.html

相关文章:

  • 「网页开发|前端开发|Vue」06 公共组件与嵌套路由:让每一个页面都平等地拥有导航栏
  • leetcode687. 最长同值路径(java)
  • MySQL的常用术语
  • 机器学习的特征工程
  • python3 修改nacos的yaml配置
  • YOLOv8 : 数据组织
  • golang如何生成zip压缩文件
  • AntDesign技术指南:构建优雅的前端界面
  • 机器人任务挖掘与智能超级自动化技术解析
  • C#通过ModbusTcp协议读写西门子PLC中的浮点数
  • 19-springcloud(中)
  • Leetcode1090. 受标签影响的最大值
  • 第七章:敏捷开发工具方法-part2-CI/CD工具介绍
  • 【自学开发之旅】Flask-回顾--对象拆分-蓝图(二)
  • 自动驾驶中间件
  • 鲲鹏920(ARM64)移植javacpp
  • python打包exe实用版
  • 什么是反向代理(Reverse Proxy)?解释反向代理的作用和常见应用。
  • 算法通关村第十二关——不简单的字符串转换问题
  • PROSOFT PTQ-PDPMV1网络接口模块
  • 力扣(LeetCode)算法_C++——稀疏矩阵的乘法
  • 华为云API人脸识别服务FRS的感知力—偷偷藏不住的你
  • 产品技术体系
  • Docker从认识到实践再到底层原理(二-3)|LXC容器
  • [运维|docker] ubuntu镜像更新时报E: Problem executing scripts APT::Update::Post-Invoke错误
  • 计算机网络的故事——HTTP首部
  • js农历与阳历转换使用笔记
  • 苹果与芯片巨头Arm达成20年新合作协议,将继续采用芯片技术
  • Linux下systemd深入指南:如何优化Java服务管理与开机自启配置
  • PMOS阵列(PMOS阵列代替)