umijs 报错 Invalid hook call 解决办法

今天发现某个页面由于 umi3 升级到 umi4 出现了问题,报错如下:

从报错上看可能有三种可能:

  1. 使用了错误的react版本
  2. 错误的使用了hooks
  3. 有多个react副本

因为 useInsertionEffect 是 react18 新引入的功能,对比项目版本,发现是符合的,排除1;

点击报错位置,进入,源码如下:

js 复制代码
function JSXStyle(props) {
    var registry = defaultRegistry ? defaultRegistry : useStyleRegistry();
    // If `registry` does not exist, we do nothing here.
    if (!registry) {
        return null;
    }
    if (typeof window === "undefined") {
        registry.add(props);
        return null;
    }
    useInsertionEffect(function() {
        registry.add(props);
        return function() {
            registry.remove(props);
        };
    // props.children can be string[], will be striped since id is identical
    }, [
        props.id,
        String(props.dynamic)
    ]);
    return null;
}

发现hooks前有判断, 那么先注释掉判断,再次尝试,依旧不行, 这种判断是恒为false的,这种并不影响react工作;

只剩下3这种可能;最终排查确实是这个问题(解决方式为将mfsu设置为false,或者为react, react-dom 设置 externals

针对这种可能,描述下排查过程:

  1. 在src下报错页面添加 window.React11 = React 赋值; 在 上述 JSXStyle 添加 window.React22 = React 赋值;

  2. 对比window.React11 === window.React22 发现返回false;

  3. 查找页面React引入地址与styled-jsx 引入地址, 需要将 webpack devtool设置为false, 截图如下:

页面内引入地址:

styled-jsx引入地址:

可以看到mfsu打包的模块与styled-jsx引入的模块ID不同,所以React存在两份的问题;

涉及知识:

external插件的作用,mfsu插件原理,styled-jsx/babel 插件机制;(此处占位,后续补充);

相关推荐
爱分享的程序猿-Clark23 分钟前
【前端分享】vue开发项目,如何实现 从A页面跳转到B页面,并传值!
前端·javascript·vue.js
breeze jiang1 小时前
从原生事件到 React 组件化:用状态驱动模型加载进度 UI
前端·react.js·ui
徐小夕1 小时前
花了3天,我写了一款开源AI公众号编辑器
前端·vue.js·github
PBitW1 小时前
git 中容易遗忘的点 (二) ⚡⚡⚡
前端·git·面试
Hilaku1 小时前
2026 年前端大洗牌:React 服务端到 Vite 的底层重构
前端·javascript·程序员
PBitW1 小时前
git 中容易遗忘的点 (三) 🚀🚀🚀
前端·git·面试
名字还没想好☜1 小时前
React setState 连续调用「丢更新」排查:批量更新与函数式更新
前端·javascript·react.js·react·usestate
sugar__salt1 小时前
DeepSeek-R1 WebGPU (1):在浏览器里跑大模型
react.js·reactjs·react·端模型
come112342 小时前
Vue 2 与 Vue 3 语法区别及使用技巧
前端·javascript·vue.js
腻害兔2 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:ERP 企业资源模块,一个轻量级进销存的完整实现?
前端·javascript·vue.js·人工智能·前端框架·产品经理·ai编程