最近开发了一个React拖拽排序组件库,计划通过npm link
到本地测试时,遇到了报错:Warning: Invalid hook call. Hooks can only be called inside of the body of a function component.
经过多轮排查,最终发现到React多实例冲突与pnpm对peerDependencies的隐式安装是核心原因,以下是完整解决流程,供同类问题参考
测试项目使用Next 15(App Router)报错,初步怀疑版本冲突:
package.json
中react
的版本范围改为"^18.3.1 || ^19.0.0"
,但测试仍报错查阅React官方文档(Invalid Hook Call警告)和关键Issue(https://github.com/facebook/react/issues/13991),提示可能是**React多实例**或**Hooks未在函数组件内调用**导致。因为组件代码没有问题所以排除后者,重点排查多实例:
Invalid hook call
和Cannot read properties of null (reading 'useState')
**,是典型多实例特征(不同React实例的Hooks上下文不共享)import React from 'react'
,其他位置无重复引入或者明显的function useState(){}
定义等rollup-plugin-visualizer
分析打包依赖,确认React未被打包进组件库package.json
中,将react
和react-dom
标记为peerDependencies
(告知用户需自行安装)vite.config.ts
中,通过build.rollupOptions.external
将React相关模块排除在打包外:["react", "react-dom", "react/jsx-runtime"]
关键:包括react/jsx-runtime
尝试暴力验证:将组件库打包后的import React from 'react'
改为测试项目中React的绝对路径(如import React from '/path/to/test-project/node_modules/react'
),测试项目运行正常
进一步排查依赖管理工具pnpm的特性: