create-react-app을 사용하는 React 앱에서 ES6 기능을 폴리 필하는 가장 좋은 방법


87

인터넷 익스플로러에서 React.js 애플리케이션을 테스트 해봤는데 ES6 / 7 코드가 Array.prototype.includes()깨지는 것을 발견했습니다.

저는 create-react-app 을 사용하고 있으며 모든 사람이 필요로하지 않기 때문에 많은 polyfill을 포함하지 않기로 선택했으며 빌드 시간이 느려집니다 (예를 들어 herehere 참조 ). 문서 (작성 당시)는 다음을 제안합니다.

런타임 지원이 필요한 다른 ES6 + 기능 (예 : Array.from () 또는 Symbol)을 사용하는 경우 적절한 폴리 필을 수동으로 포함하고 있는지 또는 대상 브라우저에서 이미이를 지원하는지 확인하십시오.

그렇다면 ... '수동으로'포함하는 가장 좋은 방법은 무엇입니까?


1
Babel은 babel-polyfill쉬운 ES6 + polyfill을 제공합니다.
loganfsmyth

1
Array.prototype.includes()실제로 ES6가 아닌 ES7에 있음을 유의하십시오
huyz

답변:


122

업데이트 :이 질문 / 답변 이후 create-react-app polyfill 접근 방식과 문서가 변경되었습니다. ie11과 같은 이전 브라우저를 지원하려면 이제 react-app-polyfill( 여기 )를 포함해야합니다 . 그러나 여기에는 " ... 최소 요구 사항 및 일반적으로 사용되는 언어 기능 " 만 포함되어 있으므로 덜 일반적인 ES6 / 7 기능 (예 Array.includes:


이 두 가지 접근 방식은 모두 작동합니다.


1. react-app-polyfill 및 core-js에서 수동 가져 오기

설치를 반응-앱 polyfill코어 JS (3.0 이상)를 :

npm install react-app-polyfill core-js 또는 yarn add react-app-polyfill core-js

polyfills.js라는 파일을 만들고 루트 index.js 파일로 가져옵니다. 그런 다음 기본 react-app polyfill과 다음과 같은 특정 필수 기능을 가져옵니다.

/* polyfills.js */

import 'react-app-polyfill/ie11';
import 'core-js/features/array/find';
import 'core-js/features/array/includes';
import 'core-js/features/number/is-nan';

/* index.js */

import './polyfills'
...

2. Polyfill 서비스

다음 줄을 index.html에 추가 하여 polyfill.io CDN을 사용하여 브라우저 별 맞춤 폴리 필 을 검색합니다.

<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=default,Array.prototype.includes"></script>

참고로, Array.prototype.includes기본 기능 세트에 포함되어 있지 않으므로 명시 적으로 요청해야 했습니다.


18
나는 아마도 더 세분화 될 것입니다. 복사 붙여 넣기 대신 core-js.NET Framework에서 개별 전역 폴리 필을 설치 하고 가져올 수 있습니다 polyfills.js. 그 외에는 두 가지 접근 방식 모두 괜찮습니다.
Dan Abramov

1
더 똑똑하게 들리 네요. Dan 감사합니다. 당신은 github.com/zloirock/core-js를 의미 합니까 (즉, npm install core-js)?
Daniel Loiterton

7
IE 11 이하에 나타나지 않는 최신 create-react-app으로 생성 된 앱에 문제가 발생했습니다. 이 솔루션 덕분에 결국 <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=default,es6"></script>(알림 es6)을 포함하고 이제는 매력처럼 작동합니다. 주요 문제는 Symbol에 대한 polyfill이 필요하다고 생각합니다.
dougmacklin

1
@dougmacklin 그냥 참고 : 제 경우에는 포함을 사용하여 IE 11 문제를 해결하지 못했기 때문에 히트 또는 미스입니다. 불행히도 IE 11의 개발자 콘솔은 어떤 언어 기능이 작동하는지 알아내는 데 매우 도움이되지 않았습니다. 우리는 babel-polyfill을 사용하게되었습니다. 압도적이지만 생산 현장을 가동해야했습니다.
Clinton Chau

1
@ClintonChau, 완전히 이해할 수 있습니다. 나는 그 의견을 게시하기 때문에, 나는 다른 IE 11 문제를 해결하기 위해 다른 프로젝트에 바벨 - polyfill를 사용하지 결국 않았다
dougmacklin

12

React에서 사용되는 일반적인 ES6 기능에 대한 polyfill 이 있는 react-app-polyfill 을 사용하세요 . 그리고 그것은 create-react-app 의 일부입니다 . README에 정의 된대로 index.js 시작 부분에 포함해야합니다.


1
내 대답이 최고라고 생각하지만 그것은 더 최근이기 때문입니다. react-app-polyfill은 불과 몇 달 전에 만들어졌고 그 전까지는 다른 대답이 분명히 더 좋았습니다 :-)
icewhite

4
안녕하세요 @icewhite, react-app-polyfill에 대해 약간 오해 한 것 같습니다. 패키지에는 Promise, window.fetch, Object.assign, Symbol, Array.from의 폴리 필이 포함됩니다. 그것은 하지 않습니다 포함 Array.prototype.includes()또는 다른 사람.
Huong Nguyen

6

저는 yarn을 사용하여 polyfill을 다운로드하고 index.js로 직접 가져 왔습니다.

명령 프롬프트에서 :

yarn add array.prototype.fill

그리고 맨 위에 index.js:

import 'array.prototype.fill' // <-- newly added import
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
...

특별히 필요한 것을 프로젝트로 가져 오기 때문에이 접근 방식이 마음에 듭니다.


1
이와 같은 것이 이제 Create React App 프로젝트에 대해 제안 된 모범 사례로 보입니다. 참조 : github.com/facebook/create-react-app/blob/master/packages/…
Peter W

3

새로운 Google Search Console과 React 앱 (create-react-app)에 문제가있는 것이 가치있는 일이었습니다. es6shim을 추가 한 후 모든 것이 해결되었습니다.

내 공개 index.html 페이지에 아래를 추가했습니다.

<script src="https://cdn.polyfill.io/v2/polyfill.min.js"></script>

0

Create React App 프로젝트에서 꺼내기

나중에 /config/polyfills.js파일 에 모든 폴리 필을 넣을 수 있습니다.

파일 끝에 다음을 입력하십시오.

Object.values = Object.values ? Object.values : o=>Object.keys(o).map(k=>o[k]);

Webpack이 자동으로이 문제를 해결합니다.)


실제로 더 나은 방법을 찾았습니다. npm install --save core-js; import 'core-js / fn / object / values';
웹 마스터

이 더 나은 방법으로 답변을 편집 해 주시겠습니까?
MattSidor

0

나는 같은 문제가 있었다. Daniel Loiterton의 솔루션이 저에게 효과적이지 않았습니다. 그러나! core-js에서 가져 오기를 하나 더 추가 import 'core-js/modules/es6.symbol';했으며 IE11에서 저에게 효과적입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.