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

相关推荐
静水leo24 分钟前
使用 Whistle 拦截接口并模拟后端响应
前端
掘金者阿豪36 分钟前
SQL Server数据迁移完成后,凌晨的数据库告警该怎么查?
前端·后端
JudithHuang38 分钟前
React 嵌套路由与布局
前端·react.js·arcgis·react·react router
htzyl2061 小时前
前端阶梯——第四十三章、实战二:待办清单To-Do
前端·javascript·html
摹客2 小时前
【3D设计】界面设计中的3D元素:应用场景+5款工具横评(含Three.js)
前端
Hilaku2 小时前
CORS 到底在保护谁?90% 的前端理解错了跨域的本质
前端·javascript·程序员
wno7042 小时前
node.js中使用jquery
前端·node.js·jquery
阿琳a_2 小时前
b-map-viewer:面向 Vue 3 的地图可视化 SDK,从接入到展示再到交互分析
前端·javascript·vue.js·gis·数据可视化·地图
10年前端老司机2 小时前
Agent 商业化困局:热闹的发布会,冷清的付费客户
前端·后端·agent