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 错误 的相关文章

随机推荐

  • 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