Create-react-app: `react-scripts`v4.0.0を使用するアプリはIE11では機能しません

作成日 2020年10月25日  ·  18コメント  ·  ソース: facebook/create-react-app

バグを説明する

アプリをreact-scripts3.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. index.tsx先頭にimport 'react-app-polyfill/ie11'; import 'react-app-polyfill/stable';を追加します
  4. yarn start
  5. サイトが通常のブラウザで完全に機能し、IEでは空白の画面であることに注意してください

予想される行動

ツールがどのように動作することを期待しましたか? 理解が正しいかどうかわからない場合は問題ありません。 何が起こると思ったかを書き留めてください。

サイトは機能するはずです(奇跡は期待していません。全体的にIEですが、空白のページは非常に悪いです)

実際の動作

何かがうまくいかなかったのですか? 何かが壊れていたり、期待どおりに動作していませんか? 可能であればスクリーンショットを添付してください! これらは、問題の診断に非常に役立ちます。

image

再現可能なデモ

可能であれば、問題を再現するプロジェクトを共有してください。 これは、問題をすぐに修正するための最も効果的な方法です。 これを行うには2つの方法があります。*新しいアプリを作成し、そのアプリで問題を再現してみます。 これは、問題がどこにあるかを大まかに知っている場合、または実際のコードを共有できない場合に役立ちます。 *または、アプリをコピーして、再現可能な最小限のデモが残るまで削除します。 これは根本原因を見つけるのに役立ちます。 その後、オプションで新しいプロジェクトを作成できます。 これは、バグデモを作成するための優れたガイドです。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

回避策が機能していません。エラーが残ります。

私のポリフィルは次のようになり、IE11では問題ありません。

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

これらは、これらのポリフィルが配置されていないと壊れてしまう他のインポートよりも上にある必要があることに注意してください。 さらに、ポリフィルはTextEncoderようないくつかの難解なAPIを提供しないため、何らかの理由で必要な場合は、それらのポリフィルをロードする必要があります。

新しいjsxトランスフォームがこれを引き起こしていると思います。ポリフィルもインポートするメインのindex.jsの先頭に/** <strong i="5">@jsxRuntime</strong> classic */を追加するか、 DISABLE_NEW_JSX_TRANSFORM=true環境変数を設定して無効にしてみてください。 私の場合、これらのいずれかがこれを修正します。

私の推測では、最初にポリフィルをインポートすることで、反応する前にそれらをロードすることができますが、コンパイラーが挿入する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'

コメントを追加しました。そうしないと、これが人々が理解できないものであり、おそらくコードベースに永遠にぶら下がってしまう可能性があるためです。

唯一の欠点は、ツリーシェイクでバンドルサイズを縮小できないことです。これは、最初にReact17にアップグレードした主な理由の1つでした:(

FWIW index.tsファイルをinit.ts main.tsxファイルとinit.tsは関連するすべてのポリフィルをインポートし、 main.tsxは実際のエントリポイントです( Reactコードを含む)とindex.tsは、両方を順番にインポートするだけです。 これにより、ポリフィルを有効にする必要のあるモジュールがポリフィルの後にロードされ、インポートの自動並べ替えを使用する場合でも、ポリフィルがメインエントリポイントの前に来るように名前が付けられます。

これは、この問題を回避するよりも実行可能な解決策になる可能性があります。

上記のどれも機能していないようです。

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. 追加ie 11browerslistpackage.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'だけです

それはポリフィルの問題のようには見えません。 デバッガーに表示されているコードはES5ではなく、破壊とデフォルトの引数を使用していますが、どちらもIE11ではサポートされていません。 "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"戻すと、 "react": "^17.0.1",でもIE 11で機能します
しかし、 "react-scripts": "4.0.0"はまだ私にとって壊れています

また、これらのソリューションの多くを試しました。 動作したのはreact-scripts3.4.4にダウングレードすることだけ

このページは役に立ちましたか?
0 / 5 - 0 評価