ความแตกต่างระหว่างชิมและโพลิฟิลคืออะไร?


406

ดูเหมือนว่าทั้งสองจะใช้ในการพัฒนาเว็บดูเช่นHTML5 Cross Browser Polyfillsซึ่งกล่าวว่า:

ดังนั้นที่นี่เรากำลังรวบรวม shims, fallbacks และ polyfills ทั้งหมด ...

หรือมีของES5-ชิมโครงการ

ในโครงการปัจจุบันของฉันเรากำลังใช้จำนวนเหล่านี้และฉันต้องการที่จะติดพวกเขาทั้งหมดในไดเรกทอรีเดียวกัน ดังนั้นสิ่งที่ฉันควรเรียกไดเรกทอรีนี้ --- shimsหรือpolyfills?


6
เปิดอีกครั้ง: ฉันคิดว่า "สิ่งที่ฉันควรเรียกว่าไดเรกทอรีนี้" อาจเป็นไปตามความคิดเห็น แต่จริงๆแล้วมันไม่ได้ให้บริบทที่กว้างกว่าของคำถาม - และนั่นคือสิ่งสำคัญที่สุดของคำถามนี้ คำตอบทั้งหมดที่นี่ดูเหมือนจะเห็นด้วยและมีการใช้ข้อเท็จจริงการอ้างอิงและความเชี่ยวชาญเฉพาะอย่างมาก
สูงศักดิ์

คำตอบ:


386
  • ชิมเป็นชิ้นส่วนใด ๆ ของรหัสที่ดำเนินการสกัดกั้นของการโทร API และให้ชั้นของนามธรรม ไม่จำเป็นต้อง จำกัด เฉพาะแอปพลิเคชันบนเว็บหรือ HTML5 / CSS3

  • polyfillเป็นประเภทของการชิมว่ารถยนต์ปอร์เช่มรดกกับเบราว์เซอร์ที่ทันสมัย HTML5 / CSS3 คุณสมบัติมักจะใช้ Javascript หรือ Flash

ตอบคำถามเฉพาะของคุณโทรไดเรกทอรีของคุณshimsถ้าคุณต้องการเก็บไดเรกทอรีทั่วไป


234

ชิม

หากคุณคุ้นเคยกับรูปแบบของอะแดปเตอร์คุณจะรู้ว่า shim คืออะไร Shims สกัดการเรียก API และสร้างเลเยอร์นามธรรมระหว่างผู้โทรและเป้าหมาย โดยทั่วไปแล้ว shims จะใช้สำหรับความสามารถในการย้อนกลับ ตัวอย่างเช่นแพ็กเกจes5-shim npm จะช่วยให้คุณเขียนไวยากรณ์ ECMAScript 5 (ES5) และไม่สนใจว่าเบราว์เซอร์กำลังเรียกใช้ ES5 หรือไม่ ใช้Date.nowเป็นตัวอย่าง นี้เป็นฟังก์ชั่นใหม่ ๆ ใน ES5 ที่ไวยากรณ์ใน ES3 จะเป็นวันใหม่ (). getTime () หากคุณใช้es5-shimคุณสามารถเขียนDate.nowและหากเบราว์เซอร์ที่คุณใช้อยู่รองรับ ES5 ก็จะทำงานได้ อย่างไรก็ตามหากเบราว์เซอร์ที่กำลังทำงานเครื่องยนต์ ES3 ES5-ชิมจะสกัดกั้นการเรียกร้องให้Date.nowและเพียงแค่คืนวันที่ใหม่ (). getTime ()แทน การสกัดกั้นนี้เรียกว่าการสั่นไหว ซอร์สโค้ดที่เกี่ยวข้องจาก es5-shim มีลักษณะดังนี้:

if (!Date.now) {
    Date.now = function now() {
        return new Date().getTime();
    };
}

polyfill

โพลีฟิลลิ่งเป็นเพียงการฉายแสงแบบพิเศษ Polyfill นั้นเกี่ยวกับการนำคุณลักษณะที่ขาดหายไปมาใช้ใน API ในขณะที่ shim ไม่จำเป็นต้องเกี่ยวกับการนำคุณลักษณะที่ขาดหายไปมาใช้เท่าที่ควร ฉันรู้ว่าสิ่งเหล่านี้ดูเหมือนคลุมเครือเกินไป แต่ในกรณีที่ใช้ shims เป็นคำที่กว้างกว่านี้ Polyfill ใช้เพื่ออธิบาย shims ที่ให้ความสามารถในการย้อนหลังสำหรับเบราว์เซอร์รุ่นเก่า ดังนั้นในขณะที่ใช้ shims เพื่อปกปิดบาปเก่า ๆ polyfills จะถูกใช้เพื่อนำการปรับปรุงในอนาคตย้อนเวลากลับไป ตัวอย่างเช่นมีการสนับสนุนสำหรับ sessionStorage ใน 7 ไม่มี แต่ polyfill ในที่sessionstorageแพคเกจ NPM จะเพิ่มคุณลักษณะนี้ใน IE7 (และเก่า) โดยใช้เทคนิคเช่นการจัดเก็บข้อมูลในชื่อคุณสมบัติของหน้าต่างหรือโดยการใช้คุกกี้


107
ดังนั้นในขณะที่ใช้ shims เพื่อปกปิดบาปเก่า ๆ polyfills จะถูกใช้เพื่อนำการปรับปรุงในอนาคตย้อนเวลากลับไป สรุปทั้งหมดนี้กับฉัน ขอบคุณสำหรับคำอธิบายที่ชัดเจน
JohnnyQ

คำตอบนี้มีประโยชน์ขอบคุณ แต่สำหรับฉันแล้วคำทั้งสองมักจะไม่ได้ใช้อย่างแม่นยำบนเว็บรวมถึง es5-shim ฉันคิดว่า es5-shim เป็นการผสมผสานระหว่าง shims และ polyfills ตามคำนิยามของคุณ
Matt Browne

WOW -> ดังนั้นในขณะที่ใช้ shims เพื่อปกปิดบาปเก่า ๆ polyfills จะถูกใช้เพื่อนำการปรับปรุงในอนาคตย้อนเวลากลับไป <- ขอบคุณมาก!
เรือเหาะ

3
ตัวอย่างวันที่ดูเหมือน Polyfill ให้ฉัน ทำไมฉันคิดว่ามันเป็น Polyfill เพราะ Date.now เป็นการโทรพื้นเมือง Polyfill จะเพิ่มคุณสมบัตินั้นด้วย API เดียวกันกับเบราว์เซอร์ ชิมมาพร้อมกับ API ใหม่เช่น: MyShim.Date.now(); โปรดแก้ไขฉันหากฉันผิด
TatzyXY

99

จากสิ่งที่ฉันเข้าใจ:

Polyfill เป็นรหัสที่ตรวจพบว่า API "ที่คาดหวัง" ขาดหายไปและใช้งานด้วยตนเอง เช่น

if (!Function.prototype.bind) { Function.prototype.bind = ...; }

shim คือรหัสที่ขัดขวางการเรียก API ที่มีอยู่และใช้ลักษณะการทำงานที่แตกต่างกัน แนวคิดในที่นี้คือการทำให้ API บางอย่างเป็นปกติในสภาพแวดล้อมที่แตกต่างกัน ดังนั้นหากเบราว์เซอร์สองตัวที่ใช้ API เดียวกันแตกต่างกันคุณสามารถขัดขวางการเรียก API ในเบราว์เซอร์ตัวใดตัวหนึ่งและทำให้พฤติกรรมนั้นสอดคล้องกับเบราว์เซอร์อื่น หรือหากเบราว์เซอร์มีข้อบกพร่องใน API ตัวใดตัวหนึ่งคุณสามารถดักการเรียกไปยัง API นั้นอีกครั้งแล้วหลีกเลี่ยงข้อบกพร่องได้


66

อ้างAxel Rauschmayerจากหนังสือของเขาที่พูด JavaScript :

  • shim คือไลบรารีที่นำ API ใหม่ไปสู่สภาพแวดล้อมที่เก่ากว่าโดยใช้วิธีการเฉพาะของสภาพแวดล้อมนั้น
  • polyfill เป็น shim สำหรับเบราว์เซอร์ API โดยทั่วไปจะตรวจสอบว่าเบราว์เซอร์รองรับ API หรือไม่ หากไม่เป็นเช่นนั้น polyfill จะติดตั้งการใช้งานของตัวเอง ที่ช่วยให้คุณใช้ API ในกรณีใดกรณีหนึ่ง คำว่า polyfill มาจากผลิตภัณฑ์ปรับปรุงบ้าน ตามเรมี่คม :

    Polyfilla เป็นผลิตภัณฑ์ของสหราชอาณาจักรที่รู้จักในชื่อ Spackling Paste ในสหรัฐอเมริกา โดยที่ในใจ: คิดว่าเบราว์เซอร์เป็นกำแพงที่มีรอยแตกในนั้น [polyfills] เหล่านี้ช่วยลดรอยแตกและทำให้เรามีเบราว์เซอร์ที่ทำงานได้อย่างราบรื่น


9

ชิม shim คือไลบรารีที่นำ API ใหม่ไปสู่สภาพแวดล้อมที่เก่ากว่าโดยใช้วิธีการเฉพาะของสภาพแวดล้อมนั้น

polyfill ในเดือนตุลาคม 2010 Remy Sharp blogged เกี่ยวกับคำว่า "polyfill" [ผ่าน Rick Waldron]:

โพลีฟิลเป็นส่วนหนึ่งของรหัส (หรือปลั๊กอิน) ที่ให้บริการเทคโนโลยีที่คุณผู้พัฒนาคาดหวังว่าเบราว์เซอร์จะให้บริการแบบเนทีฟ การทำให้แนวนอนของ API ราบรื่นขึ้นหากคุณต้องการ


8

บทความที่ยอดเยี่ยมเขียนเกี่ยวกับเรื่องนี้จากไม่กี่ปีหลังที่อธิบายได้ดี:

Polyfill คืออะไร

ในบทความนี้มีการเปรียบเทียบ (2) ดังนี้:

ชิม:ชิ้นส่วนของรหัสที่คุณสามารถเพิ่ม (เช่นJavaScript) ที่จะแก้ไขการทำงานบางอย่าง แต่มันจะส่วนใหญ่มักจะมีมันเป็น API

Polyfill:สิ่งที่คุณสามารถดรอป (เช่นJavaScript) และมันจะทำงานอย่างเงียบ ๆ เพื่อเลียนแบบAPI เบราว์เซอร์ที่มีอยู่ซึ่งไม่สนับสนุน


1
ฉันคิดว่านี่เป็นการนำเสนอที่เข้าใจผิดของทั้งการใช้งานทั่วไปและสิ่งที่ Remy Sharp พูดจริงในบล็อกโพสต์ที่คุณเชื่อมโยง ชิมส่วนใหญ่มักจะใช้กับ synonymously polyfillปัจจุบัน (ดูโดยเฉพาะอย่างยิ่งES5-ชิมและES6-ชิม ) และเรมี่เป็นโดยเฉพาะอย่างยิ่งเกี่ยวกับการบอกว่าให้เขา (โดยเปรียบเทียบกับคำว่า 'ชิม' พูดพาดพิงถึง API ที่กำหนดเองshim.gif) เขาเป็นอย่างมากไม่ได้บอกว่าคำที่ใช้ในลักษณะนี้และโดยการพูด"กับฉัน"เขาก็ยอมรับว่าการใช้งานของเขาไม่เป็นสากลโดยปริยาย
Mark Amery
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.