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

相关推荐
珑墨22 分钟前
【Turbo】使用介绍
前端
军军君011 小时前
Three.js基础功能学习十三:太阳系实例上
前端·javascript·vue.js·学习·3d·前端框架·three
xiaoqi9222 小时前
React Native鸿蒙跨平台如何实现分类页面组件通过searchQuery状态变量管理搜索输入,实现了分类的实时过滤功能
javascript·react native·react.js·ecmascript·harmonyos
打小就很皮...2 小时前
Tesseract.js OCR 中文识别
前端·react.js·ocr
qq_177767372 小时前
React Native鸿蒙跨平台实现应用介绍页,实现了应用信息卡片展示、特色功能网格布局、权限/联系信息陈列、评分展示、模态框详情交互等通用场景
javascript·react native·react.js·ecmascript·交互·harmonyos
wuhen_n2 小时前
JavaScript内存管理与执行上下文
前端·javascript
Hi_kenyon3 小时前
理解vue中的ref
前端·javascript·vue.js
jin1233224 小时前
基于React Native鸿蒙跨平台地址管理是许多电商、外卖、物流等应用的重要功能模块,实现了地址的添加、编辑、删除和设置默认等功能
javascript·react native·react.js·ecmascript·harmonyos
2501_920931704 小时前
React Native鸿蒙跨平台医疗健康类的血压记录,包括收缩压、舒张压、心率、日期、时间、备注和状态
javascript·react native·react.js·ecmascript·harmonyos
落霞的思绪4 小时前
配置React和React-dom为CDN引入
前端·react.js·前端框架