¿Cuál es la diferencia entre una cuña y un polyfill?


Ambos parecen ser utilizados en círculos de desarrollo web, ver por ejemplo HTML5 Cross Browser Polyfills , que dice:

Así que aquí estamos recolectando todas las calzas, caídas y polyfills...

O, está el proyecto es5-shim.

En mi proyecto actual estamos usando un número de estos, y quiero pegarlos todos en el mismo directorio. Entonces, ¿cómo debo llamar a este directorio---shims, o polyfills?

Author: hippietrail, 2011-07-06

6 answers

  • Un shim es cualquier pieza de código que realiza la interceptación de una llamada API y proporciona una capa de abstracción. No está necesariamente restringido a una aplicación web o HTML5/CSS3.

  • Un polyfill es un tipo de shim que adapta navegadores heredados con características HTML5/CSS3 modernas generalmente usando Javascript o Flash.

Respondiendo a su pregunta específica, llámela su directorio shims si desea mantener el directorio generico.

 290
Author: Arsalan Ahmed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-22 21:52:41

Shim

Si está familiarizado con el patrón de adaptador, entonces sabe lo que es una cuña. Shims intercepta las llamadas a la API y crea una capa abstracta entre la persona que llama y el destino. Normalmente se utilizan cuñas para mantener la compatibilidad. Por ejemplo, el paquete npm es5-shim le permitirá escribir la sintaxis ECMAScript 5 (ES5) y no le importará si el navegador está ejecutando ES5 o no. Tomar Fecha.ahora como ejemplo. Esta es una nueva función en ES5 donde la sintaxis en ES3 sería nueva fecha().getTime () . Si utiliza el es5-shim puede escribir Fecha.ahora y si el navegador en el que se está ejecutando es compatible con ES5, simplemente se ejecutará. Sin embargo, si el navegador está ejecutando el motor ES3 es5-shim interceptará la llamada a la fecha .ahora y simplemente devuelve nueva fecha().getTime () en su lugar. Esta intercepción se llama shimming. El código fuente relevante de es5-shim se ve así:

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

Polyfill

El polyfilling es realmente solo una versión especializada de shimming. Polyfill se trata de implementar características faltantes en una API, mientras que un shim no necesariamente se trata tanto de implementar características faltantes como de corregir características. Sé que esto parece demasiado vago, pero donde las calzas se utilizan como un término más amplio, polyfill se utiliza para describir calzas que proporcionan compabilidad hacia atrás para los navegadores más antiguos. Así que mientras que las calzas se usan para encubrir pecados antiguos, los polyfills se usan para traer futuro mejoras en el tiempo. Como ejemplo, no hay soporte para sessionStorage en IE7, pero el polyfill en el paquete sessionstorage npm agregará esta característica en IE7 (y anteriores) mediante el uso de técnicas como el almacenamiento de datos en la propiedad name de la ventana o mediante el uso de cookies.

 155
Author: Kjetil Klaussen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-30 10:34:49

Por lo que entiendo:

Un polyfill es un código que detecta si falta una cierta API "esperada" y la implementa manualmente. Por ejemplo,

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

Un shim es un código que intercepta llamadas API existentes e implementa un comportamiento diferente. La idea aquí es normalizar ciertas API en diferentes entornos. Por lo tanto, si dos navegadores implementan la misma API de manera diferente, podría interceptar las llamadas API en uno de esos navegadores y hacer que su comportamiento se alinee con el otro navegador. O, si un navegador tiene un error en una de sus API, podría interceptar nuevamente las llamadas a esa API y luego eludir el error.

 94
Author: Šime Vidas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-26 23:10:54

Citando Axel Rauschmayer de su libro Hablando de JavaScript:

  • Una shim es una biblioteca que trae una nueva API a un entorno anterior, utilizando sólo los medios de ese entorno.
  • Un polyfill es una cuña para una API de navegador. Normalmente comprueba si un navegador soporta una API. Si no lo hace, el polyfill instala su propio aplicación. Eso le permite usar la API en cualquier caso. El término polyfill viene de un hogar producto de mejora; según Remy Sharp :

    Polyfilla es un producto del Reino Unido conocido como Spackling Paste en los Estados Unidos. Con eso en mente: piense en los navegadores como una pared con grietas en ella. Estos [polyfills] ayudan a suavizar las grietas y nos dan una buena pared lisa de navegadores para trabajar.

 61
Author: Bergi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-24 16:30:10

Shim. Una shim es una biblioteca que trae una nueva API a un entorno más antiguo, utilizando solo los medios de ese entorno.

Polyfill. En octubre de 2010, Remy Sharp blogueó sobre el término "polyfill "[vía Rick Waldron]:

Un polyfill es una pieza de código (o plugin) que proporciona la tecnología que usted, el desarrollador, espera que el navegador proporcione de forma nativa. Aplanar el paisaje de la API si se quiere.

 9
Author: Sagittarius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-09 07:05:55

Un fantástico artículo escrito sobre esto desde hace unos años que explica esto bien:

¿Qué es un Polyfill?

En el artículo los (2) simplemente se contrastan como tales:

Shim: un fragmento de código que se podría agregar (es decir, JavaScript) que corregiría alguna funcionalidad, pero que más a menudo tendría es propia API.

Polyfill: algo que podrías dejar caer (es decir, JavaScript) y funcionaría silenciosamente para imitar api de navegador existentes que de otro modo no son compatibles.

 6
Author: atconway,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-06 04:10:10