Cách tốt nhất để ghép các tính năng của ES6 vào ứng dụng React sử dụng ứng dụng tạo phản ứng


87

Tôi đã thử nghiệm ứng dụng React.js của mình trên Internet explorer và nhận thấy rằng một số mã ES6 / 7 giống như đã Array.prototype.includes()phá vỡ nó.

Tôi đang sử dụng ứng dụng tạo-phản ứng và dường như họ đã chọn không đưa vào nhiều polyfills vì không phải ai cũng cần chúng và chúng làm chậm thời gian xây dựng (xem ví dụ ở đâyở đây ). Tài liệu (tại thời điểm viết bài) gợi ý:

Nếu bạn sử dụng bất kỳ tính năng ES6 + nào khác cần hỗ trợ thời gian chạy (chẳng hạn như Array.from () hoặc Symbol), hãy đảm bảo rằng bạn đang bao gồm các polyfills thích hợp theo cách thủ công hoặc các trình duyệt bạn đang nhắm mục tiêu đã hỗ trợ chúng.

Vậy ... cách tốt nhất để 'bao gồm chúng theo cách thủ công' là gì?


1
Babel cung cấp babel-polyfillnhư một polyfill ES6 + dễ dàng.
loganfsmyth

1
Lưu ý rằng Array.prototype.includes()thực sự là trong ES7, không phải ES6
huyz

Câu trả lời:


122

Cập nhật : Cách tiếp cận polyfill tạo ứng dụng và tài liệu đã thay đổi kể từ câu hỏi / câu trả lời này. Bây giờ bạn nên bao gồm react-app-polyfill( ở đây ) nếu bạn muốn hỗ trợ các trình duyệt cũ hơn như ie11. Tuy nhiên, điều này chỉ bao gồm " ... yêu cầu tối thiểu và các tính năng ngôn ngữ thường được sử dụng ", vì vậy bạn sẽ vẫn muốn sử dụng một trong các cách tiếp cận bên dưới cho các tính năng ES6 / 7 ít phổ biến hơn (như Array.includes)


Cả hai cách tiếp cận này đều hoạt động:


1. Nhập thủ công từ react-app-polyfill và core-js

Cài đặt react-app-polyfillcore-js (3.0+):

npm install react-app-polyfill core-js hoặc là yarn add react-app-polyfill core-js

Tạo một tệp có tên (giống như) polyfills.js và nhập nó vào tệp index.js gốc của bạn. Sau đó, nhập các polyfills ứng dụng phản ứng cơ bản, cùng với bất kỳ tính năng bắt buộc cụ thể nào, như sau:

/* 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. Dịch vụ Polyfill

Sử dụng CDN polyfill.io để truy xuất các polyfills tùy chỉnh, dành riêng cho trình duyệt bằng cách thêm dòng này vào index.html:

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

lưu ý, tôi đã phải yêu cầu Array.prototype.includestính năng rõ ràng vì nó không có trong bộ tính năng mặc định.


18
Tôi có thể sẽ nhận được nhiều chi tiết hơn. Thay vì sao chép dán, bạn có thể cài đặt core-jsvà nhập các polyfills toàn cầu riêng lẻ từ của bạn polyfills.js. Ngoài ra, cả hai cách tiếp cận đều tốt.
Dan Abramov

1
Nghe có vẻ thông minh hơn, cảm ơn Dan. Ý bạn là github.com/zloirock/core-js , tôi giả sử (tức là. Npm cài đặt core-js)?
Daniel Loiterton

7
Tôi đã gặp sự cố với một ứng dụng được tạo bằng ứng dụng tạo phản ứng mới nhất không xuất hiện trên IE 11 trở xuống. Nhờ giải pháp này, tôi đã kết thúc <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=default,es6"></script>(chú ý es6) và bây giờ nó hoạt động như một sự quyến rũ. Tôi tin rằng vấn đề chính là cần một polyfill cho Symbol.
dougmacklin

1
@dougmacklin Just FYI: Nó bị trúng hoặc trượt, bởi vì trong trường hợp của tôi, việc sử dụng bao gồm của bạn không giải quyết được vấn đề IE 11 của tôi. Thật không may, bảng điều khiển dành cho nhà phát triển trong IE 11 cũng rất không hữu ích trong việc tìm ra tính năng ngôn ngữ nào đang làm hỏng nó. Chúng tôi đã kết thúc bằng cách sử dụng babel-polyfill. Tôi biết là người nặng tay, nhưng chúng tôi cần bắt đầu hoạt động của địa điểm sản xuất.
Clinton Châu

1
@ClintonChau, hoàn toàn có thể hiểu được. Kể từ khi tôi đăng nhận xét rằng, tôi đã kết thúc phải sử dụng babel-polyfill trên một dự án khác để sửa chữa một khác nhau IE 11 vấn đề
dougmacklin

12

Sử dụng phản ứng-ứng dụng-polyfill có polyfill cho các tính năng ES6 phổ biến được sử dụng trong React. Và nó là một phần của ứng dụng tạo-phản ứng . Đảm bảo bạn đưa nó vào đầu index.js như được định nghĩa trong README.


1
Tôi nghĩ rằng câu trả lời của tôi là tốt nhất, nhưng đó là chỉ vì nó gần đây - những phản ứng-app-polyfill chỉ tạo ra một vài tháng trước và cho đến lúc đó các câu trả lời khác là rõ ràng là tốt hơn :-)
icewhite

4
Xin chào @icewhite, tôi nghĩ bạn đã hiểu sai một chút về react-app-polyfill. Gói chỉ bao gồm polifill: Promise, window.fetch, Object.assign, Symbol, Array.from. Nó không bao gồm Array.prototype.includes()hoặc những người khác.
Huong Nguyen

6

Tôi đã sử dụng sợi để tải xuống polyfill và nhập trực tiếp vào index.js của mình.

Trong dấu nhắc lệnh:

yarn add array.prototype.fill

Và sau đó, ở đầu index.js:

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

Tôi thích cách tiếp cận này vì tôi đang nhập cụ thể những gì tôi cần vào dự án.


1
Một cái gì đó như thế này hiện là phương pháp hay nhất được đề xuất cho các dự án Tạo ứng dụng React. Xem: github.com/facebook/create-react-app/blob/master/packages/…
Peter W

3

Đối với những gì đáng giá là tôi gặp sự cố với Google Search Console mới và ứng dụng React của tôi (tạo-ứng dụng phản ứng). Sau khi thêm es6shim, tất cả đã được giải quyết.

Tôi đã thêm phần bên dưới vào trang index.html công khai của mình.

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

0

Loại bỏ khỏi Dự án ứng dụng Tạo React của bạn

Sau đó, bạn có thể đặt tất cả các polyfills của mình vào /config/polyfills.js tệp

Đặt phần sau vào cuối tệp

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

Webpack sẽ tự động sửa lỗi này cho bạn;)


thực sự đã tìm ra một cách tốt hơn, npm install --save core-js; nhập 'core-js / fn / object / values';
quản trị viên web

Bạn có thể vui lòng chỉnh sửa câu trả lời của mình bằng cách này tốt hơn không?
MattSidor

0

Tôi đã từng gặp vấn đề tương tự. Một giải pháp từ Daniel Loiterton không phù hợp với tôi. Nhưng! Tôi đã thêm một lần nhập nữa từ core-js import 'core-js/modules/es6.symbol';và điều này phù hợp với tôi trên IE11.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.