Ý nghĩa của polyfill trong HTML5 là gì?


387

Ý nghĩa của polyfill trong HTML5 là gì? Tôi đã thấy từ này trong nhiều trang web về HTML5, ví dụ HTML5-Cross-Browser-Polyfills.

Vì vậy, ở đây chúng tôi đang thu thập tất cả các miếng chêm, dự phòng và polyfill để cấy chức năng HTML5 trong các trình duyệt không hỗ trợ chúng.

Tôi thực sự không hiểu ý nghĩa của polyfill là gì.

Đây có phải là một kỹ thuật HTML5 mới hay một thư viện JavaScript? Tôi chưa bao giờ nghe từ này trước HTML5.

Và sự khác biệt giữa miếng chêm, dự phòng và polyfill là gì?


1
Bạn có thể kiểm tra tốt hơn sự hiểu biết blogs.msdn.com/b/jennifer/archive/2011/08/04/...

@ user3400622 Cảm ơn liên kết, lời giải thích trong liên kết rất rõ ràng.
Andrew Lam

Câu trả lời:


377

Polyfill là một dự phòng trình duyệt, được tạo bằng JavaScript, cho phép chức năng mà bạn mong đợi hoạt động trong các trình duyệt hiện đại để hoạt động trong các trình duyệt cũ hơn, ví dụ: để hỗ trợ canvas (một tính năng HTML5) trong các trình duyệt cũ hơn.

Đó là một kỹ thuật HTML5, vì nó được sử dụng cùng với HTML5, nhưng nó không phải là một phần của HTML5 và bạn có thể có các polyfill mà không cần HTML5 (ví dụ: để hỗ trợ các kỹ thuật CSS3 bạn muốn).

Đây là một bài viết tốt:

http://remysharp.com/2010/10/08/what-is-a-polyfill/

Dưới đây là danh sách toàn diện về Polyfills và Shims:

https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills


6
Vì vậy, nó có nghĩa là eg7.js cũng là một polyfill
Jitendra Vyas

1
Có: "Nhiều bản sửa lỗi bao gồm độ trong suốt PNG, kiểu / bộ chọn CSS, sửa lỗi kết xuất, v.v." Đó là thêm chức năng này thông qua javascript mà trình duyệt chưa hỗ trợ.
Calvin Froedge

1
Tôi nghĩ rằng từ Polyfills xuất hiện sau HTML5. Shim có khác với Polyfills không?
Jitendra Vyas

16
Một shim được khái quát hơn. Một polyfill là một loại shim. Đây là một câu hỏi giải thích rõ về nó: stackoverflow.com/questions/6599815/
Kẻ

6
remysharp.com/2010/10/08/what-is-a-polyfill liên kết này không chỉ là một "bài viết hay" mà thực sự là định nghĩa đầy đủ và nguồn gốc của từ bởi người đặt ra từ đó. Trích dẫn: "sản phẩm Polyfilla (spackling ở Mỹ) là một loại bột nhão có thể được dán vào tường để che các vết nứt và lỗ hổng." Bài đăng cũng bao gồm các khái niệm mà shim có trước và khác với polyfill. Đó là phải đọc, IMO.
mã hóa aaron

64

Trước hết, hãy làm rõ những gì một polyfil không phải là: Một polyfill không phải là một phần của Tiêu chuẩn HTML5. Cũng không phải là một polyfill giới hạn trong Javascript, mặc dù bạn thường thấy các polyfill được nhắc đến trong các bối cảnh đó.

Thuật ngữ polyfill tự nó đề cập đến một số mã "cho phép bạn có một số chức năng cụ thể mà bạn mong đợi trong các trình duyệt hiện đại hoặc hiện đại cũng hoạt động trong các trình duyệt khác không có hỗ trợ cho chức năng đó được tích hợp."

Nguồn và ví dụ về polyfill tại đây:

http://www.programmerinterview.com/index.php/html5/html5-polyfill/


31

Polyfill là một đoạn mã (hoặc plugin) cung cấp công nghệ mà bạn, nhà phát triển, mong muốn trình duyệt cung cấp nguyên bản.


2
Giải thích tốt.
Eugen Sunic

16

Một polyfill là một shim thay thế cuộc gọi ban đầu bằng cuộc gọi đến shim.

Ví dụ: giả sử bạn muốn sử dụng đối tượng navigator.mediaDevices, nhưng không phải tất cả các trình duyệt đều hỗ trợ điều này. Bạn có thể tưởng tượng một thư viện cung cấp một shim mà bạn có thể sử dụng như thế này:

<script src="js/MediaShim.js"></script>
<script>
    MediaShim.mediaDevices.getUserMedia(...);
</script>

Trong trường hợp này, bạn rõ ràng đang gọi một shim thay vì sử dụng đối tượng hoặc phương thức ban đầu. Polyfill, mặt khác, thay thế các đối tượng và phương thức trên các đối tượng ban đầu.

Ví dụ:

<script src="js/adapter.js"></script>
<script>
    navigator.mediaDevices.getUserMedia(...);
</script>

Trong mã của bạn, có vẻ như bạn đang sử dụng đối tượng navigator.mediaDevices tiêu chuẩn. Nhưng thực sự, polyfill (trong ví dụ của adapter.js) đã thay thế đối tượng này bằng đối tượng của chính nó.

Một trong những nó đã thay thế nó là một shim. Điều này sẽ phát hiện nếu tính năng này được hỗ trợ nguyên bản và sử dụng nó nếu có, hoặc nó sẽ hoạt động xung quanh nó bằng các API khác nếu không.

Vì vậy, một polyfill là một loại shim "trong suốt". Và đây là ý nghĩa của Remy Sharp (người đặt ra thuật ngữ này) khi nói rằng " nếu bạn xóa tập lệnh polyfill, mã của bạn sẽ tiếp tục hoạt động, mà không có bất kỳ thay đổi nào được yêu cầu mặc dù đã xóa bỏ polyfill ".


9
shim là gì?
Oliver Watkins

3
@Oliver Watkins Nếu bạn đã quen thuộc với mẫu bộ điều hợp, thì bạn sẽ biết shim là gì. Shims chặn các lệnh gọi API và tạo một lớp trừu tượng giữa người gọi và mục tiêu. Thông thường các miếng chêm được sử dụng để tương thích ngược
Anurag Ratna

@AnuragRatna Tôi sẽ không sử dụng 'chặn' để tránh nhầm lẫn .. Chặn thường đề cập đến mã mà (trong suốt) chặn tức là không có người gọi biết. Shims cung cấp các lệnh gọi API để tương thích ngược
Qetesh
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.