Image de couverture - Shims et Polyfills : de quoi s'agit-il ?

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 ?

IcĂŽne de calendrier
IcĂŽne de chronomĂštre 4 min

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 :

copié !
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.

Lire aussi