Comprendre Babel, les polyfills et core-js
Pourquoi Babel ?
JavaScript évolue rapidement. Chaque nouvelle version du langage (ECMAScript) introduit des fonctionnalités utiles : let/const, arrow functions, async/await, Array.prototype.includes, etc.
Le problème ? Tous les navigateurs ne supportent pas immédiatement ces nouveautés. C’est là qu’intervient Babel.
Babel, c’est quoi ?
Babel est un transpilateur JavaScript. Contrairement à un compilateur classique (comme C → binaire), un transpilateur convertit du code d’une version du langage vers une autre version du même langage.
Par exemple : Babel peut transformer du code ES2022 vers un JavaScript compatible ES5, compris par des navigateurs comme Internet Explorer 11.
Exemple de transformation :
// Code source moderne
const sum = (a, b) => a + b;
// Code transpilé par Babel
var sum = function(a, b) {
return a + b;
};
Et les polyfills dans tout ça ?
Certaines fonctionnalités JavaScript ne peuvent pas être transpilées, car elles dépendent des API natives du moteur JavaScript. Par exemple : Array.prototype.includes, Promise, Symbol, Object.entries, etc. C’est là qu’intervient le polyfill.
Qu’est-ce qu’un polyfill ?
Un polyfill est un morceau de code (souvent une fonction ou une bibliothèque) qui émule une fonctionnalité récente sur des environnements plus anciens.
Exemple de polyfill :
if (!Array.prototype.includes) {
Array.prototype.includes = function(searchElement, fromIndex) {
return this.indexOf(searchElement, fromIndex) !== -1;
};
}
Les polyfills ne sont pas générés automatiquement par Babel. Pour cela, il faut utiliser une bibliothèque tierce comme core-js.
core-js : la bibliothèque de polyfills standard
core-js est une bibliothèque complète qui implémente les fonctions modernes de JavaScript, que Babel peut insérer dans votre code pour garantir la compatibilité.
Babel ne sait pas polyfiller par lui-même. Il peut orchestrer l’ajout de polyfills via @babel/preset-env en combinaison avec core-js. Voici comment configurer Babel pour insérer automatiquement les bons polyfills selon les navigateurs que vous ciblez :
// babel.config.js
{
"presets": [
[
"@babel/preset-env",
{
"useBuiltIns": "entry", // ou "usage"
"corejs": "3.22"
}
]
]
}
@babel/preset-env est un preset intelligent qui analyse la liste des navigateurs que vous ciblez.
À partir de cette cible, il décide :
-
Quelles fonctionnalités JavaScript ne sont pas supportées par ces navigateurs.
-
Quelles transformations Babel doit appliquer (ex. transformer les flèches en fonctions classiques, les classes en fonctions prototypes, etc.).
-
Quels polyfills doivent être inclus (via core-js), selon votre option useBuiltIns.