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 插件机制;(此处占位,后续补充);

相关推荐
程序员黑豆2 小时前
Java 注释详解:单行、多行与文档注释的完整指南
java·前端·ai编程
剪刀石头布啊2 小时前
antd中可编辑表格中巧用useWatch实现联动高性能效果,以及定制延伸学习
前端
油丶酸萝卜别吃3 小时前
前端转全栈学习路线
前端·学习
浮生望3 小时前
前端路由进阶:History API原理与手写HistoryRouter
前端
陆枫Larry4 小时前
JavaScript 中的竞态是什么,为啥会有竟态?
前端
上海安当技术6 小时前
半天接入:USBKey RESTful API + C 动态库,Web 和 C/S 两套集成路径实战
前端·后端·restful·集成·usbkey
DevUI团队6 小时前
从“即兴创作”到“规格先行”,华为云码道(CodeArts)代码智能体持续深耕企业级规范驱动开发能力
前端·人工智能·后端
weixin_431600447 小时前
NestJS 入门(3):Guard 如何挡住未登录请求?
前端·后端·学习·nest.js
kyriewen7 小时前
我用Claude Code两天干完了团队两周的排期——周报发出去那一刻我就后悔了
前端·javascript·ai编程
IT_陈寒8 小时前
JavaScript类型转换把我坑惨了,这破玩意真该早点搞明白
前端·人工智能·后端