【问题标题】:React Uncaught ReferenceError: process is not definedReact Uncaught ReferenceError:未定义进程
【发布时间】:2022-05-03 01:58:39
【问题描述】:

我遇到了 iframe 的问题。 直到今天,一切都按预期工作。今天我添加了一个非常简单的 Modal 组件,不知何故 iframe 开始出现。它出现在我编辑文件并完成热重载时。同样与此问题有关,它在控制台中显示错误为“未捕获的 ReferenceError:未定义进程”。 有人可以帮我解决这个问题吗?

import React, {useEffect} from 'react';
import ReactDOM from "react-dom";
import Close from "../static/assets/close-white.svg"

const trapStyles = {
    position: 'absolute',
    opacity: 0
}
const Test = () => {

    return ReactDOM.createPortal(
        <div data-react-modal-body-trap="" tabIndex="0" style={trapStyles}/>,
        document.getElementById("app")
    )
}

const Modal = ({ open, onClose, children }) => {

    useEffect(() => {

        if (open)document.getElementById("app").classList.add("ReactModal__Body--open");

        return () => {
            document.getElementById("app").classList.remove("ReactModal__Body--open")
        }
    })
    if (!open) return null

    return ReactDOM.createPortal(
        <>
            <Test />
            <div className="ReactModal__Overlay--after-open">
                <div className="modal-form-page"
                     tabIndex="-1" role="dialog" aria-modal="true">
                    <button onClick={onClose} className="close-modal">
                        <img id="close-button" alt="close" src={Close}/>
                    </button>
                    { children }
                </div>
            </div>
        </>,
        document.getElementById("ModalPortal")
    )
};

export default Modal;
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8"/>
    <link href="%PUBLIC_URL%/favicon.ico" rel="icon"/>
    <meta content="width=device-width, initial-scale=1" name="viewport"/>
    <meta content="#000000" name="theme-color"/>
    <link href="%PUBLIC_URL%/logo192.png" rel="apple-touch-icon"/>
    <link href="%PUBLIC_URL%/manifest.json" rel="manifest"/>
    <title>React App</title>
</head>
<body id="app">
<noscript>You need to enable javascript to run this website</noscript>
<div id="content">
<-- All other content render here -->
</div>
<div class="ReactModalPortal" id="ModalPortal"></div>
</body>
</html>
Uncaught ReferenceError: process is not defined
    at Object.4043 (<anonymous>:2:13168)
    at r (<anonymous>:2:306599)
    at Object.8048 (<anonymous>:2:9496)
    at r (<anonymous>:2:306599)
    at Object.8641 (<anonymous>:2:1379)
    at r (<anonymous>:2:306599)
    at <anonymous>:2:315627
    at <anonymous>:2:324225
    at <anonymous>:2:324229
    at HTMLIFrameElement.e.onload (index.js:1)
4043 @ VM128:2
r @ VM128:2
8048 @ VM128:2
r @ VM128:2
8641 @ VM128:2
r @ VM128:2
(anonymous) @ VM128:2
(anonymous) @ VM128:2
(anonymous) @ VM128:2
e.onload @ index.js:1
be @ index.js:1
he @ index.js:1
tryDismissErrorOverlay @ webpackHotDevClient.js:184
onHotUpdateSuccess @ webpackHotDevClient.js:109
handleApplyUpdates @ webpackHotDevClient.js:257
(anonymous) @ webpackHotDevClient.js:273
load (async)
be @ index.js:1
he @ index.js:1
tryDismissErrorOverlay @ webpackHotDevClient.js:184
onHotUpdateSuccess @ webpackHotDevClient.js:109
handleApplyUpdates @ webpackHotDevClient.js:257
(anonymous) @ webpackHotDevClient.js:273
Promise.then (async)
tryApplyUpdates @ webpackHotDevClient.js:271
handleSuccess @ webpackHotDevClient.js:106
push../node_modules/react-dev-utils/webpackHotDevClient.js.connection.onmessage @ webpackHotDevClient.js:203

【问题讨论】:

标签: reactjs


【解决方案1】:

升级到 react-scripts v5 并不总是解决方案。

here 描述了此错误的全部原因。简而言之,这是一个简要摘要:

该错误是由react-error-overlay 引起的(许多人从未听说过,因为它是react-scripts 的依赖项)。此软件包的依赖项已更新以支持 webpack v5,遗憾的是与 react-scripts v4 不兼容。


方法一

如果升级到react-scripts v5 不适合您,您还可以尝试另一种解决方法,即将react-error-overlay 固定到版本6.0.9

删除您的yarn.lockpackage-lock.json,然后重新安装您的依赖项。

纱线

yarn 会立即考虑分辨率字段。

"resolutions": {
  "//": "See https://github.com/facebook/create-react-app/issues/11773",
  "react-error-overlay": "6.0.9"
}

对于 yarn 工作区,将上述分辨率放在根 package.json 中,而不是放在有问题的文件夹中。请参阅此issue 评论。

npm (>=v8.3.0)

在 npm 中,resolutions 的等价物是 overrides

"overrides": {
  "react-error-overlay": "6.0.9"
},

npm (

您需要确保npm 在运行npm install 时使用resolutions 字段。要自动安装,请参阅answer


方法二

另一个(不那么流行的)解决方法是使用 webpack 插件:

plugins:[
  new webpack.DefinePlugin({
      process: {env: {}}
  })
]

如果你使用craco,你只需要修改你的craco.config.js文件来添加那个插件:

{
  ...
  webpack: {
    plugins: {
      add: [
        new webpack.DefinePlugin({
          process: {env: {}}
        })
      ]
    }
  }
}

对于customize-cra 用户,请参阅此answer 或此github comment

最后一种方法并不流行,因为没有多少 CRA 用户必须直接接触 webpack 才能使用 react。

【讨论】:

  • 在 craco 的情况下,我应该只使用 webpack.DefinePlugin 和参数 {process: {env: {}}} 吗?或者我是否以某种方式引用了依赖版本?
  • @xtra 如果你只是想通过 craco 来做,那么使用带有这些参数的 webpack.DefinePlugin 插件就足够了。我已经更新了答案,明确指出有两种解决问题的方法
  • 方法 1,修复(更准确地修补)问题...这很烦人...
  • 方法 1 示例仅适用于纱线。对于 NPM 使用:“覆盖”:{“react-error-overlay”:“6.0.9”},
【解决方案2】:

我尝试将 react-scripts 更新到 5.0.0,但没有成功。

解决方案:-

  • 如果您使用的是npm:-

npm i -D react-error-overlay@6.0.9

  • 如果您使用的是yarn:-

yarn add -D react-error-overlay@6.0.9

【讨论】:

  • 或者yarn add -dev react-error-overlay@6.0.9,将node_modules中的react-error-overlay复制到node_modules/react-dev-utils/node_modules
  • 这适用于 `"react-scripts": "4.0.3"
  • 该死的 awsm - 非常感谢!!!
  • 更新 react-scripts 并不总是最痛苦的解决方案,一些应用程序仍然依赖于 webpack v4 polyfills。这是一种更安全的生活。谢谢。
【解决方案3】:

在 package.json 中添加这段代码

 "devDependencies": {
"react-error-overlay": "6.0.9"  },

之后运行 npm install 命令。 在互联网上滚动 2 天后,它对我有用。

【讨论】:

  • TY!这就像一个魅力,我只花了
  • 谢谢!这解决了它
【解决方案4】:

直到最终修复(maybe this PR),对于任何使用 npm(不是纱线)的人来说,解决方案是这样的:

添加到 package.json:

"resolutions": {
    "react-error-overlay": "6.0.9"
},

"scripts":{
    "preinstall": "npx npm-force-resolutions",
    ....
},

"devDependencies":{
    "react-error-overlay": "6.0.9",
...
}

然后做一个

npm install

【讨论】:

  • 依赖中还需要 "react-scripts": "4.0.1" 版本。
【解决方案5】:

通过将 react-scripts 更新到 5.0.0 解决了这个问题

【讨论】:

  • 我将我的 react-scripts 升级到 5.0.0,但仍然遇到这个错误,而且它还冻结了 UI
  • 它会冻结 UI,因为您有错误。
  • 我的设置被弹出,我没有 react-scripts,怎么办?
【解决方案6】:

我找到了最好的解决方案。

问题是因为你在 React 热加载时丢失了window.process 变量,并且进程只存在于节点上,而不是浏览器上。

所以你应该在应用加载时将其注入浏览器。

将此行添加到App.js

useEffect(() => {
    window.process = {
      ...window.process,
    };
  }, []);

【讨论】:

  • 这一定是最好的解决方案。您不必触摸依赖项配置。
  • 如果你需要这个类形式,然后使用 componentDidMount (){ window.process = { ...window.process } }
  • @WahinyaBrian 我很高兴你喜欢
  • 玩得好!简单而有效的解决方案
【解决方案7】:

很多答案建议将react-error-overlay 覆盖为6.0.9,但这对我不起作用(2022 年 2 月 11 日)。在尝试覆盖覆盖之前,我使用的是 react-scripts 5.0.0react-error-overlay 6.0.10

我没有急于在我的 CRA 应用程序中定义 webpack 配置(如suggested by smac89),而是将react-scripts 降级为4.0.3

它适用于 react-scripts: 4.0.3,它将 react-error-overlay 解析为 6.0.10

所以,我的解决方法是:

  • 在 package.json 中设置 "react-scripts": "4.0.3"
  • 删除您的锁定文件(yarn.lock 或 package-lock.json)和 node_modules
  • 运行安装

【讨论】:

【解决方案8】:

如果您使用的是 npm > v8.3,您可以使用 overrides,就像在您的 package.json 中一样。

  "overrides": {
    "react-error-overlay": "6.0.9"
  },

有关覆盖的更多信息,请转至here

问题是6.0.10 中的重大更改,即使您将react-error-overlay 的版本固定到6.0.9,某些依赖项(如react-dev-utils)也会安装此版本,这就是为什么必须使用覆盖的原因。

【讨论】:

    【解决方案9】:

    对于那些使用 create-react-app 和 customize-cra 的人,您可以使用 @smac89 的方法 2 解决方案和 addWebpackPlugin,这对我有用。

    反应脚本:5.0.0 网络包:5.64.4

    // config-overrides.js
    const webpack = require('webpack');
    const { override, addWebpackPlugin } = require('customize-cra');
    
    module.exports = override(
      addWebpackPlugin(
        new webpack.DefinePlugin({
          process: { env: {} },
        })
      )
    );
    
    

    此解决方案在 npm start 上引发警告,但应用程序编译正确。

    WARNING in DefinePlugin
    Conflicting values for 'process.env'
    

    这个警告并没有阻止任何事情,但如果有人知道如何解决它,请回答这个线程:)

    【讨论】:

      【解决方案10】:

      在 yarn.lock 或 package-lock.json 文件中查找字符串

      "react-error-overlay@npm:^6.0.9":
        version: 6.0.10 <-- here problem
        etc...
      

      并替换为

      react-error-overlay@^6.0.9:
        version "6.0.9"
        resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a"
        integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==
      

      保存文件并运行 yarn install

      【讨论】:

      • 锁定文件不能手动编辑。不要那样做!使用resolutions 强制使用特定版本的react-error-overlay
      【解决方案11】:

      对于那些仍然有这个问题的人:如果使用 Webpack,运行 npm install -D dotenv-webpack,如果使用 typescript npm install -D @types/dotenv-webpack
      然后在你的 Webpack 配置中,添加 import Dotenv from "dotenv-webpack";

      ...
      plugins: [
          ...
          new Dotenv(),
      ],
      ...
      

      https://github.com/mrsteele/dotenv-webpack/blob/master/README.md

      在尝试了所有其他方法之后,这终于对我有用了。

      【讨论】:

        【解决方案12】:

        从 react-scripts 4.0.3 升级到 5.0.0 对我有用。

        我最终遇到了以下错误(如果您使用的是 craco,则相关):

        TypeError: match.loader.options.plugins 不是函数

        @weiwei in their answer here解决了这个问题

        【讨论】:

          【解决方案13】:

          将 react-scripts 从 v4 升级到 "react-scripts": "^5.0.0", 似乎帮助了我

          【讨论】:

            【解决方案14】:

            今天(22 年 2 月 14 日)面临同样的问题,使用 Docker 容器作为 ReactJS 应用程序,我将 react-scripts 版本降级到 4.0.3 并在 6.0.9 版本上安装 react-error-overlay 解决了这个问题。 所以步骤是:

            1. 删除 package-lock.json 文件
            2. 进入 package.json 文件
              1. 替换依赖"react-scripts": "4.0.3"
              2. 使用 "react-error-overlay": "6.0.9" 将 react-error-overlay 添加到开发依赖项中
            3. 更新 npm:npm 更新

            我希望它可以帮助任何人节省一些时间, 干杯。

            【讨论】:

              猜你喜欢
              • 2022-09-27
              • 2022-11-21
              • 1970-01-01
              • 2022-07-17
              • 1970-01-01
              • 1970-01-01
              • 2022-01-21
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多