Shims et Polyfills : de quoi s'agit-il ?
shim, polyfill... des termes que l'on croise souvent en inspectant le code source de nos apps web. Mais de quoi s'agit-il exactement ?
Dans le monde du dĂ©veloppement web, il est courant de rencontrer des situations oĂč certaines fonctionnalitĂ©s modernes ne sont pas encore supportĂ©es par tous les navigateurs ou environnements dâexĂ©cution. Pour pallier cette absence de support, les dĂ©veloppeurs utilisent souvent des shims ou des polyfills. Mais que sont-ils exactement, et comment fonctionnent-ils ?
Quâest-ce quâun shim ?
Un shim (littĂ©ralement « cale ») est un morceau de code destinĂ© Ă reproduire ou Ă©tendre des fonctionnalitĂ©s dans des environnements oĂč elles ne sont pas nativement disponibles.
Ces shims jouent en quelques sortes le rÎle de « prothÚse logicielle », permettant à des fonctionnalités plus récentes ou spécifiques de fonctionner dans des systÚmes plus anciens ou différents de ceux pour lesquels elles ont été initialement conçues.
La plupart des shims implĂ©mentent la rĂ©trocompatibilitĂ© dâune fonctionnalitĂ© du langage JavaScript (mĂ©thode, API web, etc.), dâune balise HTML ou dâune propriĂ©tĂ© CSS au sein dâun navigateur.
Par exemple, un shim pourrait implémenter dans des navigateurs qui ne la supportent pas nativement une méthode JavaScript moderne comme Array.prototype.includes
.
Différences entre shim et polyfill ?
Bien que les termes « shim » et « polyfill » soient souvent utilisés de maniÚre interchangeable, il existe une différence subtile entre les deux :
- Shim : Un shim peut reproduire des fonctionnalités existantes ou étendre des fonctionnalités supplémentaires.
- Polyfill : Un polyfill se concentre sur la reproduction exacte de la fonctionnalitĂ© manquante. Il vise Ă fournir une implĂ©mentation conforme Ă la spĂ©cification dâorigine. Un polyfill est donc par extension un shim.
Pourquoi utiliser des shims et polyfills ?
1. Compatibilité
Les shims et polyfills permettent aux dĂ©veloppeurs dâutiliser des fonctionnalitĂ©s modernes tout en maintenant la compatibilitĂ© avec des navigateurs ou des environnements plus anciens.
2. Interopérabilité
Ils permettent aux dĂ©veloppeurs de travailler avec des bibliothĂšques et des frameworks modernes, reposant sur des fonctionnalitĂ©s rĂ©centes sans se soucier des limitations des navigateurs ou des environnements dâexĂ©cution.
3. Adoption Progressive
Ils facilitent lâadoption progressive de nouvelles fonctionnalitĂ©s en permettant aux utilisateurs de bĂ©nĂ©ficier de nouvelles capacitĂ©s, tout en assurant un support pour les versions plus anciennes.
Exemples de shims/polyfills
Certaines fonctionnalitĂ©s dont la compatibilitĂ© nâest pas encore maximale peuvent nĂ©cessiter des polyfills. Câest entre autres le cas de :
- LâAPI
fetch
en JS, pour effectuer des requĂȘtes HTTP. - Les promesses avec
Promise
, pour traiter le rĂ©sultat dâopĂ©rations asynchrones. - Flexbox, le module de placement CSS.
- Les variables CSS
- Les conteneurs sémantiques HTML
Importmaps
, facilitant lâimport de code JS sans systĂšme de build- Etc.
Pour illustrer cela, prenons lâexemple de la mĂ©thode JS Array.prototype.includes
, qui permet de vĂ©rifier si un tableau contient un certain Ă©lĂ©ment. Cette mĂ©thode nâest pas disponible dans les navigateurs plus anciens.
Voici un exemple de polyfill possible, implémentant cette méthode en JS :
if (!Array.prototype.includes) {
Array.prototype.includes = function(searchElement, fromIndex) {
// Convertir this en objet
var O = Object(this);
// Obtenir la longueur du tableau
var len = parseInt(O.length) || 0;
// Si la longueur est 0, retourner false
if (len === 0) {
return false;
}
// Convertir fromIndex en entier
var n = parseInt(fromIndex) || 0;
// Déterminer l'index de départ
var k;
if (n >= 0) {
k = n;
} else {
k = len + n;
if (k < 0) {k = 0;}
}
// Parcourir le tableau à partir de l'index de départ
var currentElement;
while (k < len) {
currentElement = O[k];
if (searchElement === currentElement ||
(searchElement !== searchElement && currentElement !== currentElement)) {
return true;
}
k++;
}
// Si l'élément n'est pas trouvé, retourner false
return false;
};
}
Les shims et polyfills sont des outils prĂ©cieux dans lâarsenal du dĂ©veloppeur, permettant de reproduire ou dâĂ©tendre des fonctionnalitĂ©s dans des environnements oĂč elles ne sont pas nativement disponibles. Ils facilitent la compatibilitĂ©, lâinteropĂ©rabilitĂ©, et lâadoption progressive de nouvelles fonctionnalitĂ©s, tout en aidant Ă surmonter les limitations des environnements plus anciens.
En comprenant les concepts de shims et de polyfills, vous serez mieux prĂ©parĂ© Ă Ă©crire du code compatible avec une large gamme de navigateurs et dâenvironnements, tout en tirant parti des fonctionnalitĂ©s modernes disponibles dans le langage ou la plateforme que vous utilisez.