Create-react-app: 带有“反应脚本” v4.0.0的应用程序无法在IE11中运行

创建于 2020-10-25  ·  18评论  ·  资料来源: facebook/create-react-app

描述错误

将我的应用程序从react-scripts 3.4.4升级到4.0.0后,我发现该应用程序根本无法在IE11中运行。
另外-当我从最新的CRA创建新应用时,添加了react-app-polyfill我发现它也根本无法正常工作。
image

我的package.json看起来像这样:

{
  "name": "cra4",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^5.11.4",
    "@testing-library/react": "^11.1.0",
    "@testing-library/user-event": "^12.1.10",
    "@types/jest": "^26.0.15",
    "@types/node": "^12.0.0",
    "@types/react": "^16.9.53",
    "@types/react-dom": "^16.9.8",
    "react": "^17.0.1",
    "react-app-polyfill": "2.0.0",
    "react-dom": "^17.0.1",
    "react-scripts": "4.0.0",
    "typescript": "^4.0.3",
    "web-vitals": "^0.2.4"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ]
  }
}

当我运行yarn build并从build/目录提供服务时,也会出现相同的错误。

您是否尝试恢复依赖关系?

这是默认的CRA行为。

您在《用户指南》中搜索了哪些词?

有一些常见的已记录问题,例如观察程序未检测到更改或构建失败。 在《用户指南》的“疑难解答”部分中对它们进行了描述:https://facebook.github.io/create-react-app/docs/troubleshooting请扫描以下几节以了解常见问题。 此外,您可以在《用户指南》中搜索自己遇到的问题:https://facebook.github.io/create-react-app/如果找不到解决方案,请分享您搜索的词。 这有助于我们为可能遇到相同问题的将来的读者改进文档。

(如果相关,请在此处写下您的答案。)

环境

为了帮助确定问题是否特定于平台,浏览器或模块版本,需要有关您的环境的信息。 这使维护人员可以快速重现问题并提供反馈。 在终端的React应用程序文件夹中运行以下命令。 注意:结果将直接复制到剪贴板。 `npx create-react-app --info`将命令的输出粘贴到下面的部分中。
Environment Info:

  current version of create-react-app: 3.4.1
  running from C:\Users\XXX\AppData\Local\Yarn\Data\global\node_modules\create-react-app

  System:
    OS: Windows 10 10.0.19041
    CPU: (16) x64 AMD Ryzen 7 3700X 8-Core Processor
  Binaries:
    Node: 14.14.0 - C:\Program Files\nodejs\node.EXE
    Yarn: 1.22.5 - C:\Program Files (x86)\Yarn\bin\yarn.CMD
    npm: 6.14.8 - C:\Program Files\nodejs\npm.CMD
  Browsers:
    Edge: 44.19041.423.0
    Internet Explorer: 11.0.19041.1
  npmPackages:
    react: ^17.0.1 => 17.0.1
    react-dom: ^17.0.1 => 17.0.1
    react-scripts: 4.0.0 => 4.0.0
  npmGlobalPackages:
    create-react-app: Not Found

重现步骤

  1. 使用打字稿模板创建新的CRA应用
  2. yarn add react-app-polyfill
  3. 添加import 'react-app-polyfill/ie11'; import 'react-app-polyfill/stable';到顶部index.tsx
  4. yarn start
  5. 观察到该站点在普通浏览器中可以完美运行,并且在IE中是空白屏幕

预期行为

您对工具的期望如何? 如果您不确定自己的理解是正确的,那就很好。 只需写下您认为会发生的事情。

网站应该可以正常工作(我并不期待奇迹。总体而言,这是IE浏览器,但是空白页非常糟糕)

实际行为

出问题了吗? 有东西坏了,还是表现不正常? 请尽可能附上屏幕截图! 它们对于诊断问题非常有帮助。

image

可复制的演示

如果可以,请共享一个可重现此问题的项目。 这是尽快解决问题的最有效方法。 有两种方法可以做到:*创建一个新的应用程序,然后尝试在其中重现该问题。 如果您大致了解问题出在哪里或无法共享实际代码,则此功能很有用。 *或者,复制您的应用并删除内容,直到获得最小的可复制演示为止。 这对于查找根本原因很有用。 然后,您可以选择创建一个新项目。 这是创建错误演示的好指南:https://stackoverflow.com/help/mcve完成后,将项目推送到GitHub并将其链接粘贴到下面:

(粘贴到示例项目的链接以及重现该问题的确切说明。)

如果跳过此步骤会怎样? 我们将尽力为您提供帮助,但是在很多情况下,这是不可能的,因为缺少重要的信息。 在这种情况下,我们会将问题标记为优先级较低,如果没有明确的方向,则最终将其关闭。 不过,我们仍然感谢这份报告,因为最终其他人可能会为此创建一个可复制的示例。 感谢您帮助我们帮助您!
bug report needs triage

最有用的评论

+,关于生产版本的相同问题
https://reactjs.org/docs/error-decoder.html/?invariant=31&args [] = object%20with%20keys%20%7B%24%24typeof%2C%20type%2C%20key%2C%20ref%2C %20props%2C%20_owner%7D
image

所有18条评论

如果我没记错的话,由于配置了browserslist ,因此在开发模式下新项目根本无法在IE上运行。

image

(请参阅package.json )。

@ Pierre-Do
是的,我使用缺少的信息更新了我的问题。
我忘记了开箱即用不支持IE11,但是使用react-app-polyfill无法正常工作:(

+,关于生产版本的相同问题
https://reactjs.org/docs/error-decoder.html/?invariant=31&args [] = object%20with%20keys%20%7B%24%24typeof%2C%20type%2C%20key%2C%20ref%2C %20props%2C%20_owner%7D
image

我的解决方法:

import 'react-app-polyfill/ie11';
// import 'react-app-polyfill/stable';
import 'core-js/stable';
import 'regenerator-runtime/runtime';

我也受到这个问题的影响

我可以确认@ezBill解决方案适合我。
也许react-app-polyfill需要修复?

我可以确认@ezBill解决方案适合我。

+1

解决方法对我不起作用,错误仍然存​​在。

我的polyfill看起来像这样,而IE11也没有问题:

import "react-app-polyfill/ie11";
import "react-app-polyfill/stable";

请注意,这些必须高于任何其他没有适当填充的情况下都会破坏的输入。 另外,polyfill不提供其他更深奥的API,例如TextEncoder因此如果出于某些原因需要使用polyfill,您仍然需要为其加载它们。

我认为新的jsx转换会导致这种情况,请尝试通过在主index.js的顶部添加/** <strong i="5">@jsxRuntime</strong> classic */来禁用它,并在其中导入您的polyfills-或设置DISABLE_NEW_JSX_TRANSFORM=true环境变量。 就我而言,这些方法都可以解决此问题。

我的猜测是,通过首先导入polyfill可以使它们在反应之前加载,但是不能在编译器插入的import {jsx as _jsx} from 'react/jsx-runtime';行之前加载它们。

@msbarry我可以确认这可以解决此问题。 感谢您的帮助!

我们遇到了同样的问题。 不过,我们已经将许多代码库转换为新的JSX格式(不再需要导入React的格式)。

好消息! 我们能够保留所有新的JSX语法!

我们只需要将此应用到src/index.js文件的顶部。

/** <strong i="10">@jsxRuntime</strong> classic */
import 'react-app-polyfill/ie11'

// IE11 needs "jsxRuntime classic" for this initial file which means that "React" needs to be in scope
// https://github.com/facebook/create-react-app/issues/9906
import React from 'react'

添加了注释,因为否则我们会看到这是人们不理解的,并且可能永远留在代码库中。

唯一的缺点是我们不必摇树来减少包的大小,这是我们首先升级到React 17的主要原因之一:(

FWIW我们将index.ts文件拆分为init.tsmain.tsx文件,其中init.ts导入所有相关的polyfills,而main.tsx是实际的入口点(包含React代码)和index.ts都按顺序导入。 这样可以确保在polyfill之后加载可能需要polyfill的所有模块,并且命名可以确保即使使用自动分类导入功能时,polyfill也要位于主入口之前。

与不必解决此问题相比,这可能是更可行的解决方案。

以上似乎都不起作用。

IE11错误

image

点击错误将我们带到这里

image

IE版本

image

这是一个非常简单的示例

  1. npx create-react-app ie11app
  2. yarn add react-app-polyfill
  3. 更新index.js
/** <strong i="23">@jsxRuntime</strong> classic */
import 'react-app-polyfill/ie11';
import 'react-app-polyfill/stable';
import React from 'react';
import ReactDOM from 'react-dom';

ReactDOM.render(
    <div>Come on</div>,
  document.getElementById('root')
);
  1. package.json中将ie 11添加到browerslist package.json
{
  "name": "ie11app",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^5.11.4",
    "@testing-library/react": "^11.1.0",
    "@testing-library/user-event": "^12.1.10",
    "react": "^17.0.1",
    "react-app-polyfill": "^2.0.0",
    "react-dom": "^17.0.1",
    "react-scripts": "4.0.0",
    "web-vitals": "^0.2.4"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all",
      "ie 11"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version",
      "ie 11"
    ]
  }
}
  1. yarn start

尝试从index.js中删除import 'react-app-polyfill/stable';

您只需要import 'react-app-polyfill/ie11'

看起来不像是polyfill问题。 您在调试器中看到的代码不是ES5,它使用解构和默认参数,而IE11均不支持。 尝试在browserslist使用"ie >= 11" browserslist而不是"ie 11" 。 这就是我所拥有的,不确定是否任何一种语法都应该起作用。

@ Dan503 @pluma我尝试了两种方式, "ie >= 11"和删除import 'react-app-polyfill/stable'; ,但是还是没有运气。

您能这么善良地创建一个新的npx create-react-app ie11app并检查它在IE11上是否仍然适用吗?

谢谢

更新:
恢复到"react-scripts": "^3.0.0"可以在IE 11即使有"react": "^17.0.1",
但是"react-scripts": "4.0.0"对我来说还是坏了

我也尝试了许多这样的解决方案。 唯一有效的方法是将react-scripts降级3.4.4

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

stopachka picture stopachka  ·  3评论

fson picture fson  ·  3评论

JimmyLv picture JimmyLv  ·  3评论

adrice727 picture adrice727  ·  3评论

rdamian3 picture rdamian3  ·  3评论