Webpack 外部 React 导致 React Hooks 错误

2024-02-01

我是作者FireJS https://github.com/eAdded/FireJS。我遇到了一个issue https://github.com/eAdded/FireJS/issues/4带有反应钩子。

(node:21793) UnhandledPromiseRejectionWarning: Error: Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:
1. You might have mismatching versions of React and the renderer (such as React DOM)
2. You might be breaking the Rules of Hooks
3. You might have more than one copy of React in the same app
See https://reactjs.org/warnings/invalid-hook-call-warning.html for tips about how to debug and fix this problem.
    at resolveDispatcher (webpack://%5Bname%5D/./node_modules/react/cjs/react.development.js?:1465:13)
    at useState (webpack://%5Bname%5D/./node_modules/react/cjs/react.development.js?:1496:20)
    at Header (webpack://__FIREJS_APP__/./src/pages/404.js?:22:73)
    at processChild (/media/dedsec/Data/Projects/FireJS/node_modules/react-dom/cjs/react-dom-server.node.development.js:3043:14)
    at resolve (/media/dedsec/Data/Projects/FireJS/node_modules/react-dom/cjs/react-dom-server.node.development.js:2960:5)
    at ReactDOMServerRenderer.render (/media/dedsec/Data/Projects/FireJS/node_modules/react-dom/cjs/react-dom-server.node.development.js:3435:22)
    at ReactDOMServerRenderer.read (/media/dedsec/Data/Projects/FireJS/node_modules/react-dom/cjs/react-dom-server.node.development.js:3373:29)
    at Object.renderToString (/media/dedsec/Data/Projects/FireJS/node_modules/react-dom/cjs/react-dom-server.node.development.js:3988:27)
    at /media/dedsec/Data/Projects/FireJS/dist/architects/StaticArchitect.js:51:36
    at default_1.render (/media/dedsec/Data/Projects/FireJS/dist/architects/StaticArchitect.js:57:11)
    at /media/dedsec/Data/Projects/FireJS/dist/FireJS.js:99:143
    at default_1.<anonymous> (/media/dedsec/Data/Projects/FireJS/dist/classes/Plugin.js:20:13)
    at Generator.next (<anonymous>)
    at /media/dedsec/Data/Projects/FireJS/dist/classes/Plugin.js:8:71
    at new Promise (<anonymous>)
    at __awaiter (/media/dedsec/Data/Projects/FireJS/dist/classes/Plugin.js:4:12)
(Use `node --trace-warnings ...` to show where the warning was created)
(node:21793) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 2)
(node:21793) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

I've 双重检查中给出的每一条建议帮助页面 https://reactjs.org/warnings/invalid-hook-call-warning.html,但我无法解决该问题。

我将 React 捆绑为外部块,然后将其用作库。这是我的快照网页包配置 https://github.com/eAdded/FireJS/blob/master/src/architects/WebpackArchitect.ts;

            target: 'web',
            mode: this.$.config.pro ? "production" : "development",
            entry: {
                "React": "react",
                "ReactDOM": "react-dom",
                "ReactHelmet": "react-helmet",
            },
            output: {
                path: this.$.config.paths.lib,
                filename: "e[contentHash].js",
                library: "[name]",//make file as library so it can be imported for static generation
                libraryTarget: "window"
            }
        mergedConfig.externals["react"] = 'React';
        mergedConfig.externals["react-dom"] = "ReactDOM";
        mergedConfig.externals["react-helmet"] = "ReactHelmet";
        const cssLoaderUse = [MiniCssExtractPlugin.loader,
            {
                loader: 'css-loader',
                options: {
                    modules: {
                        hashPrefix: 'hash',
                    },
                },
            }
        ];
        mergedConfig.module.rules.push({
                test: /\.(js|jsx)$/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ["@babel/preset-env", "@babel/preset-react"]
                    }
                },
            }, {
                test: /\.sass$/i,
                loader: [...cssLoaderUse, 'sass-loader']
            }, {
                test: /\.less$/i,
                loader: [...cssLoaderUse, 'less-loader']
            }, {
                test: /\.css$/i,
                use: cssLoaderUse
            }
        );

我将其导出为window.__FIREJS_APP__

        mergedConfig.output.library = "__FIREJS_APP__";
        mergedConfig.output.libraryTarget = "window";

我试图运行的反应文件

import React, { useState } from 'react';

export default() => {
  // Declare a new state variable, which we'll call "count"
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

渲染过程

runApp: function (func = ReactDOM.render) {
        func(React.createElement(window.__FIREJS_APP__.default, {content: window.__MAP__.content}),
            document.getElementById("root")
        );
    }

if (window.__SSR__)
    LinkApi.runApp(ReactDOM.hydrate)
else
    LinkApi.runApp()

为什么我认为这是一个 webpack 问题?

以前,当我正常捆绑文件时,React Hooks 工作完美,但当我切换到外部 React 时。 React Hooks 开始导致这个问题。


我想出了如何解决这个问题。你需要捆绑react, react-dom and react-dom/server到同一个包。

Eg:

window.React = require("react");
window.ReactDOM = require("react-dom")
window.ReactDOMServer = require("react-dom/server")

捆绑上述文件并将其导入为您的第一个脚本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Webpack 外部 React 导致 React Hooks 错误 的相关文章

  • 摩卡 - Chai Karma“套件未定义”

    我对 jscript tdd 很陌生 遇到了问题 希望有人能告诉我我在做什么 在浏览器中运行测试 通过 HTML 文件 一切正常 通过节点和业力运行它们我得到以下异常 我想在 node js 主机的 karma 中使用 Mocha 和 Ch
  • 可以在初始 DOM 解析期间/之前修改 DOM 吗?

    是否可以在初始 DOM 解析期间或之前修改 DOM 或者我是否必须等到 DOM 被解析和构建之后才能与其交互 更具体地说 是否有可能阻止 DOM 中的脚本元素使用用户脚本 内容脚本或 Chrome 或 Firefox 中的类似脚本运行 在解
  • 使用 dc.js 按条形值对条形图中的条形进行排序(排序)

    如何通过维度的计算值而不是维度本身的名称对 dc js 示例中的 x 轴 维度 进行排序 例如 请考虑序数条形图的 dc js 示例 https github com dc js dc js blob master web examples
  • Snap.svg - 停止在可悬停元素的子元素上重新触发悬停事件

    对于一个项目 我使用的 SVG 形状由背景多边形和背景多边形上方的一些文本 我已将其转换为路径 组成 我正在使用 Snap svg 为我的形状设置动画 当我将鼠标悬停在多边形上时 形状应该缩放到特定尺寸 包括其中的所有内容 鼠标移开时 形状
  • React Native - 无法从“index.js”解析模块“@babel/runtime/helpers/interopRequireDefault”

    正如中提到的无法解析模块 babel runtime helpers interopRequireDefault https stackoverflow com questions 52486219 unable to resolve mo
  • Draggable JS Bootstrap 模式 - 性能问题

    对于工作中的项目 我们在 JavaScript 中使用 Bootstrap Modal 窗口 我们想让一些窗口可移动 但我们遇到了 JQuery 的性能问题 myModal draggable handle modal header Exa
  • Angular - CSS - 自定义类型=文件输入,如何使用按钮而不是标签?

    我制作了一个类型为 file 的自定义输入字段 因为我不喜欢默认的输入字段 为了实现这一目标 我做了
  • 调整图像大小并将画布旋转 90 度

    这里有很多关于在 js 上使用画布旋转图像的主题 我阅读了其中的大部分内容 但无法找到解决我的问题的方法 我正在接收任何分辨率的图像 来自上传组件 我将其大小调整为 1024x768 如下所示 var canvas document cre
  • window.location 和 location.href 之间的区别

    我对之间的区别感到困惑window location and location href 两者似乎都以相同的方式行事 有什么不同 window location是一个对象 它保存有关当前文档位置的所有信息 主机 href 端口 协议等 lo
  • DataTables row.add 到特定索引

    我正在替换这样的行项目 var targetRow entity row dataTable targetRow closest table dataTable DataTable dataTable row targetRow remov
  • 将 UMD Javascript 模块导入浏览器

    你好 我正在对 RxJS 进行一些研究 我可以通过在浏览器中引用它来使用该库 如下所示 它使用全局对象命名空间变量 Rx 导入 我可以制作可观察的东西并做所有有趣的事情 当我将 src 更改为指向最新的 UMD 文件时 一切都会崩溃 如下所
  • className 属性是否承担 Reactjs 中 id 属性的角色?

    由于 id 属性在 Reactjs 组件中很少使用 因为 id 属性意味着组件不会被重用 那么是否使用 className 属性来代替 id 呢 如果是这样的话 那么 Reactjs 中相当于 HTML 中的 class 属性的是什么 cl
  • 在移动设备上滚动

    这个问题更多的是一个建议研究 我确实希望它对其他人有帮助 并且它不会关闭 因为我不太确定在哪里寻求有关此事的建议 在过去的 6 个月里 我一直在进行移动开发 我有机会处理各种设备上的各种情况和错误 最麻烦的是滚动问题 当涉及到在网站的多个区
  • Vue 和 Vuex:处理依赖的计算属性

    我的应用程序是一个使用 Vuex 在 Vue 中构建的精简电子表格 关键组件是TableCollection Table and Row The TableCollection有一个包含多个的数组Table对象 每个Table有一个包含多个
  • 对于只触及我的工作表的 Google 表格脚本,收到“此应用程序未经验证”

    我正在编写一个 Google Sheets 脚本 我只想访问与 gs 文件关联的同一电子表格中的数据 似乎我应该有权在自己的电子表格中运行脚本 但是每当我运行一个函数时 我都会得到一个This app isn t verified信息 我该
  • 从 FileReader 设置背景图像样式

    我正在寻找一种解决方案 允许我从文件上传输入中获取文件并通过设置 document body style backgroundImage 来预览它 以下代码用于在 Image 元素中显示预览 function setImage id tar
  • JavaScript 相对路径

    在第一个 html 文件中 我使用了一个变量类别链接 var categoryLinks Career prospects http localhost Landa DirectManagers 511 HelenaChechik Dim0
  • 如何确定所有角度2分量都已渲染?

    当所有 Angular2 组件完成渲染时 是否会触发一个角度事件 For jQuery 我们可以用 function 然而 对于 Angular2 当domready事件被触发 html 只包含角度组件标签 每个组件完成渲染后 domrea
  • 如何使用asm.js进行测试和开发?

    最近我读到asm js规范 看起来很酷 但是是否有任何环境 工具来开发和测试这个工具 这还只是处于规范阶段吗 您可以尝试使用 emscripten 和 ASM JS 1 并从侧分支在 firefox 构建中运行它 有关 asm js 的链接
  • Vue.js[vuex] 如何从突变中调度?

    我有一个要应用于 json 对象的过滤器列表 我的突变看起来像这样 const mutations setStars state payload state stars payload this dispatch filter setRev

随机推荐

  • Jenkins job DSL 插件 - 隐藏参数

    我正在使用詹金斯隐藏参数插件 https wiki jenkins ci org display JENKINS Hidden Parameter Plugin但我找不到像使用其他参数那样在 DSL 中编写它的语法 例如 https jen
  • ImportError:使用 Jupyter Notebook 时没有名为 numpy 的模块 - Google Cloud Dataproc

    在 Google Dataproc 上启动 Jupyter Notebook 时 导入模块失败 我尝试使用不同的命令安装模块 一些例子 import os os sytem sudo apt get install python numpy
  • 使用 Python、文件

    我有一些需要读取的数据文件 我知道我应该使用 Dataset 但是有没有一种方法可以下载这些文件 而无需手动下载 而是通过其 URL 来下载 在我的例子中会是什么样子 我正在使用 conda python 和 netCDF4 无论我做什么
  • 如何在 Yii2 中进行多次 UPSERT?

    我正在使用 Yii2 高级模板 我必须在 MySql 数据库中插入 1000 到 2000 条记录 是否可以制作多个UPSERT 查询 in Yii2 请帮助我提供您的建议 答案 谢谢 从版本 2 0 14 开始 您可以使用 upsert
  • pandas:添加具有其他两列中任意一列的值的新列

    pd DataFrame A None 2 None None 3 4 B 1 2 3 4 5 6 A B 0 NaN 1 1 2 2 2 NaN 3 3 NaN 4 4 3 5 5 4 6 如何添加列C这将从列中获取值A如果不是 NaN
  • 如何将车辆品牌的 NCIC 代码值转换为 DCCIS 代码值?

    业务分析师告诉业务规则这已经改变了 现在他们希望我首先检查 计数 以查看是否有多个 NcicCode 在 VehicleMakeMapping 查找文档中 与 MncisCode 在输入文档中 匹配 如果 VehicleMakeMappin
  • Xcode 5.1 构建 opencv 在 64 位模拟器上失败

    我将 Xcode 更新到 5 1 使用 opencv 框架 2 4 的 iOS 应用程序项目中出现了许多错误 我的电脑是 macbook air 和 OSX 10 9 2 当我编译我的项目时 当我使用 Iphone Retina 3 5 英
  • ssis中动态表创建和加载数据

    我对 ssis 有一点疑问 文本文件具有基于位置的位置数据 需要在 sql server 中动态创建表并使用 ssis 包加载相关位置数据 源文本文件具有如下所示的示例数据 编号 名称 地点 1 abc 海德 2 巴努 陈 3 杰 邦 4
  • 正则表达式在页面上查找单词,包括内部标签

    谢谢切坦 萨斯特里 https stackoverflow com users 31284 chetan sastry我有这个正则表达式代码来解析我的页面以获取单词列表并将 TM 添加到其中 var wordList jQuery UI j
  • 如果大于批处理文件

    我编写了一个简单的批处理文件来根据数字选择运行常用网站 这是我的代码 我正在尝试设置它 以便如果有人输入 6 或更大的数字 它将转到 N但每当我输入 6 时 批处理文件就会退出 我努力了if input gt 6 goto N但它只是告诉我
  • WordPress Rest api响应发送html内容类型问题,URL中带有正斜杠

    从我的自定义 WordPress Rest api 中 我需要将以下文本作为内容类型 html 返回 OK ImageSendURL www yourdomain xxx Plugin DownloadOrders 这是我返回相同内容的代码
  • 如何使用加特林将 scala 类导入到另一个类中?

    注意 我是加特林新手 对 Scala 几乎一无所知 我正在开始将负载测试从 Jmeter 转换为加特林 我被困在如何组织代码库上 我找到的所有示例都是单个文件示例 如何将代码从一个模拟类导入到另一个模拟类中 我现在有这个类和测试场景 pac
  • HttpRouteBuilder - 它去了哪里以及为什么?

    我将 Web API 2 的 nuget 包从 RC1 升级到了 5 0 0 然后傻眼地发现原来可以访问的 HttpRouteBuilder 变成了内部的 除此之外 不再有以 HttpRouteBuilder 作为参数的 HttpConfi
  • 如何将 XML“行”加载到列表框 C# 的索引中

    我正在尝试将 xml 的单个 行 加载到列表框索引中
  • seaborn distplot / 具有多个分布的 displot

    我正在使用seaborn 绘制分布图 我想用不同的颜色在同一个图上绘制多个分布 以下是我开始绘制分布图的方法 import numpy as np import pandas as pd from sklearn datasets impo
  • 使用继承来反 Postgres 中的反模式 (OTLT)

    我知道 一个真正的查找表 的概念是一种反模式 通常不应该使用 参考网上的许多文章 但是 我想知道当您在 Postgres 中使用表继承时 情况是否仍然如此 您永远不会读取或插入主查找表 它更多地充当其他查找表的模板 您不会失去任何引用完整性
  • 排列 - 所有可能的数字集

    我有从 0 到 8 的数字 我想要结果是这些数字的所有可能集合 每个集合应该使用所有数字 每个数字只能在集合中出现一次 我希望看到用 PHP 制作的可以打印结果的解决方案 或者 至少 我想对组合学理论有所了解 因为我早已忘记了它 计算有多少
  • 如何确定列表中的几个最小值?

    我有一个清单 其中至少有几个 some list 1 4 6 4 1 7 是否有内置函数或任何智能解决方案来获取最小值索引 result 0 4 到目前为止我是这样做的 但我更喜欢更短 更容易阅读的解决方案 min 10 10 result
  • 计划任务在 Windows Server 2008 R2 中不起作用

    我正在尝试通过 Windows Server 2008 R2 中的任务计划程序运行 cmd 我已从服务器计算机中管理员组中的用户登录到服务器 运行计划任务时 上次运行时间 当 状态 已准备就绪时 列的值为 0x1 但什么也没发生 运行 cm
  • Webpack 外部 React 导致 React Hooks 错误

    我是作者FireJS https github com eAdded FireJS 我遇到了一个issue https github com eAdded FireJS issues 4带有反应钩子 node 21793 Unhandled