Version 7.13.0 : Records et Tuples, hypothèses granulaires du compilateur et cibles globales
Cette page a été traduite par PageTurner AI (bêta). Non approuvée officiellement par le projet. Vous avez trouvé une erreur ? Signaler un problème →
Nous venons de publier Babel 7.13.0, la première version mineure de 2021 !
Cette version inclut des fonctionnalités importantes pour @babel/core : une option targets (similaire à celle de @babel/preset-env) partageable entre différents plugins, une option assumptions pour affiner précisément votre configuration et produire un résultat de compilation plus compact, ainsi que la prise en charge des plugins et presets écrits en modules ECMAScript natifs.
Babel prend désormais en charge la transformation de la proposition ECMAScript Records and Tuples, qui introduit des structures de données immuables et l'égalité structurelle en JavaScript, ainsi que le parsing de la proposition Module Blocks.
Nous avons également ajouté la prise en charge de nouvelles fonctionnalités Flow et TypeScript.
Vous pouvez consulter le journal complet des modifications sur GitHub.
Mise à jour du financement
Nous avons rejoint le programme "GitHub Sponsors for organizations", vous pouvez désormais nous sponsoriser directement via GitHub 😊.
Ces fonds soutiennent les efforts continus de notre équipe (actuellement un mainteneur à plein temps et trois à temps partiel) pour améliorer la stabilité et développer de nouvelles fonctionnalités.
Nos dons et dépenses sont ouvertement suivis sur notre page Open Collective, où nous tracerons également les dons provenant de GitHub Sponsors.
Nous accueillons les dons de particuliers et d'entreprises. Si votre société souhaite devenir sponsor Gold ($1k/mois) et discuter des modalités, contactez-nous à team@babeljs.io !
Principales fonctionnalités
Option globale targets (#12189, RFC)
L'option targets de @babel/preset-env permet de spécifier les environnements cibles, choisissant automatiquement la syntaxe à transformer et les polyfills à injecter. Depuis la sortie de @babel/preset-env, nous avons constaté que les plugins eux-mêmes peuvent aussi bénéficier de connaître vos cibles. Actuellement, cela nécessite de spécifier deux fois vos cibles (par exemple avec nos nouveaux plugins de polyfill). L'introduction de targets comme option globale permet désormais de les spécifier une seule fois :
| Old configuration | New configuration |
|---|---|
babel.config.json | JSON |
Nous recommandons de migrer votre configuration Babel vers cette nouvelle option targets, qui offre ces avantages supplémentaires :
-
Meilleure gestion de la cible
esmodules: true(elle est combinée avec les autres cibles plutôt que de les remplacer) -
Vous bénéficierez automatiquement de sorties plus optimisées au fur et à mesure que nous ajouterons la prise en charge des
targetsdans nos plugins !
Vous trouverez les détails de cette nouvelle option dans son RFC.
🔮 À l'avenir, nous pourrions intégrer
@babel/preset-envdans@babel/corepour éviter d'installer un paquet supplémentaire. Cette nouvelle option constitue une première étape dans cette direction !
Option globale assumptions (#12219, RFC)
De nombreux plugins Babel proposent une option loose, qui demande au compilateur de générer un code plus compact et plus rapide en faisant certaines hypothèses sur votre code, au détriment du strict respect de certaines spécifications JavaScript.
Cependant, l'option loose présente des inconvénients qui créent de la confusion : le terme lui-même ne décrit pas clairement son impact réel, et pire encore, elle nécessite parfois une configuration sur plusieurs plugins pour garantir une compilation cohérente.
Pour résoudre ces problèmes, nous avons ajouté une nouvelle option globale assumptions permettant de préciser quelles hypothèses Babel peut faire sur votre code ! À l'instar de l'option targets, chaque plugin reçoit désormais la liste des hypothèses activées, éliminant ainsi la nécessité de configurer chaque option individuellement. Ce mécanisme est précieux car une hypothèse peut influencer plusieurs plugins, et un plugin peut être affecté par plusieurs hypothèses.
Il s'agit d'une fonctionnalité avancée. Tout comme l'ancienne option loose, soyez très prudent lors de l'activation des hypothèses : elles ne respectent pas entièrement les spécifications ECMAScript et pourraient provoquer des comportements inattendus dans votre code.
Par exemple, lors de la transformation de classes, Babel génère par défaut ce code :
| Input | Output |
|---|---|
JavaScript | JavaScript |
Cependant, activer l'hypothèse noClassCalls indique à Babel : « Je n'essaie jamais d'appeler des classes sans new, donc vous pouvez compiler sans vous en soucier » :
{
"targets": "firefox 30",
"assumptions": { "noClassCalls": true },
"presets": ["@babel/preset-env"]
}
| Input | Output |
|---|---|
JavaScript | JavaScript |
Consultez la liste complète des hypothèses dans notre documentation, où vous pouvez individuellement les activer ou les désactiver pour voir comment elles affectent le résultat compilé.
Prise en charge de Records et Tuples (#12145)
Grâce à une collaboration avec Bloomberg, Babel prend désormais en charge la transformation de la proposition "Records and Tuples" (stage 2).
Le plugin Babel transforme la syntaxe des records et tuples en utilisant les fonctions globales Record et Tuple :
| Input | Output |
|---|---|
JavaScript | JavaScript |
Cela implique de charger un polyfill pour ces fonctions globales, comme @bloomberg/record-tuple-polyfill, via une importation dans votre code ou une balise <script> :
<script src="https://unpkg.com/@bloomberg/record-tuple-polyfill@0.0.3/lib/index.umd.js" />
NOTE : Aucun moteur JavaScript ne supporte actuellement les records et tuples nativement, le polyfill est donc toujours requis.
Pour activer cette transformation, ajoutez @babel/plugin-proposal-record-and-tuple à votre configuration.
Nouvelles fonctionnalités Flow (#12193, #12234)
Babel 7.13.0 prend en charge deux nouvelles fonctionnalités Flow :
-
Annotation de type
thisdans les fonctions, permettant de typer l'objetthiscomme un paramètre :JavaScriptfunction getPerson(this: Database, id: string): Person {
this instanceof Database; // true
} -
Déclarations
enumavec membres inconnus :JavaScriptenum PetKind {
Dog,
Cat,
Snake,
...
}
Support de TypeScript 4.2 (#12628)
TypeScript 4.2 introduit de nouvelles fonctionnalités syntaxiques comme les signatures de constructeurs abstraits.
Consultez l'article de release TypeScript pour plus de détails.
Modules ES automatiques dans @babel/runtime (#12632)
@babel/runtime contient toutes les fonctions d'assistance d'exécution de Babel dans les formats CommonJS et modules ECMAScript.
Jusqu'à présent, vous deviez choisir manuellement celui que vous souhaitiez utiliser, en spécifiant l'option useESModules de @babel/plugin-transform-runtime.
Nous avons réorganisé la structure interne de @babel/runtime en tirant parti du nouveau champ "exports" du fichier package.json, pris en charge par Node.js et les bundlers, afin qu'ils puissent choisir automatiquement entre CJS et ESM.
Pour cette raison, l'option useESModules est désormais dépréciée et sera supprimée dans Babel 8.