@babel/plugin-transform-modules-umd
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 →
History
| Version | Changes |
|---|---|
v7.14.0 | Implemented the importInterop option |
Ce plugin est inclus dans @babel/preset-env sous l'option modules
Ce plugin transforme les modules ES2015 en format UMD. Notez que seule la syntaxe des instructions import/export (import "./mod.js") est transformée, car Babel ne connaît pas les différences d'algorithmes de résolution entre les implémentations des modules ES2015 et UMD.
⚠️ Ce plugin ne prend pas en charge l'import dynamique (import('./lazy.js')).
Exemple
Entrée
export default 42;
Sortie
(function(global, factory) {
if (typeof define === "function" && define.amd) {
define(["exports"], factory);
} else if (typeof exports !== "undefined") {
factory(exports);
} else {
var mod = {
exports: {},
};
factory(mod.exports);
global.actual = mod.exports;
}
})(this, function(exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
exports.default = 42;
});
Installation
- npm
- Yarn
- pnpm
- Bun
npm install --save-dev @babel/plugin-transform-modules-umd
yarn add --dev @babel/plugin-transform-modules-umd
pnpm add --save-dev @babel/plugin-transform-modules-umd
bun add --dev @babel/plugin-transform-modules-umd
Utilisation
Avec un fichier de configuration (Recommandé)
{
"plugins": ["@babel/plugin-transform-modules-umd"]
}
Vous pouvez également remplacer les noms de bibliothèques spécifiques lorsque ce module s'exécute dans le navigateur. Par exemple, la bibliothèque es6-promise s'expose comme global.Promise plutôt que global.es6Promise. Cela peut être accommodé via :
{
"plugins": [
[
"@babel/plugin-transform-modules-umd",
{
"globals": {
"es6-promise": "Promise"
}
}
]
]
}
Sémantique par défaut
Plusieurs points sont à noter concernant la sémantique par défaut.
Premièrement, cette transformation utilise le nom de base de chaque import pour générer les noms globaux dans la sortie UMD. Cela signifie que si vous importez plusieurs modules avec le même nom de base, comme :
import fooBar1 from "foo-bar";
import fooBar2 from "./mylib/foo-bar";
cela se transpilera en deux références vers le même objet global du navigateur :
factory(global.fooBar, global.fooBar);
Si vous configurez les options du plugin ainsi :
{
"globals": {
"foo-bar": "fooBAR",
"./mylib/foo-bar": "mylib.fooBar"
}
}
cela transpilera toujours les deux en un seul objet global du navigateur :
factory(global.fooBAR, global.fooBAR);
car encore une fois, la transformation utilise uniquement le nom de base de l'import.
Deuxièmement, le remplacement spécifié sera toujours passé à la fonction toIdentifier dans babel-types/src/converters. Cela signifie que si vous spécifiez un remplacement comme une expression de membre :
{
"globals": {
"fizzbuzz": "fizz.buzz"
}
}
cela ne se transpilera pas en factory(global.fizz.buzz). À la place, cela se transpilera en factory(global.fizzBuzz) selon la logique de toIdentifier.
Troisièmement, vous ne pouvez pas remplacer le nom global exporté.
Sémantique plus flexible avec exactGlobals: true
Tous ces comportements peuvent limiter la flexibilité de la map globals. Pour supprimer ces limitations, vous pouvez définir l'option exactGlobals à true. Cela indique au plugin de :
-
toujours utiliser la chaîne d'import complète au lieu du nom de base lors de la génération des noms globaux
-
ignorer le passage des remplacements
globalsà la fonctiontoIdentifier. À la place, ils sont utilisés exactement comme écrits, vous obtiendrez donc des erreurs si vous n'utilisez pas des identifiants valides ou des expressions de membre (point) non calculées valides. -
autoriser le remplacement du nom global exporté via la map
globals. Tout remplacement doit à nouveau être un identifiant valide ou une expression de membre valide.
Ainsi, si vous définissez exactGlobals à true sans passer de remplacements, le premier exemple :
import fooBar1 from "foo-bar";
import fooBar2 from "./mylib/foo-bar";
se transpilera en :
factory(global.fooBar, global.mylibFooBar);
Et si vous configurez les options du plugin ainsi :
{
"globals": {
"foo-bar": "fooBAR",
"./mylib/foo-bar": "mylib.fooBar"
},
"exactGlobals": true
}
alors cela se transpilera en :
factory(global.fooBAR, global.mylib.fooBar);
Enfin, avec les options du plugin configurées ainsi :
{
"plugins": [
"@babel/plugin-external-helpers",
[
"@babel/plugin-transform-modules-umd",
{
"globals": {
"my/custom/module/name": "My.Custom.Module.Name"
},
"exactGlobals": true
}
]
],
"moduleId": "my/custom/module/name"
}
cela se transpilera en :
factory(mod.exports);
global.My = global.My || {};
global.My.Custom = global.My.Custom || {};
global.My.Custom.Module = global.My.Custom.Module || {};
global.My.Custom.Module.Name = mod.exports;
Via CLI
babel --plugins @babel/plugin-transform-modules-umd script.js
Via l'API Node
require("@babel/core").transformSync("code", {
plugins: ["@babel/plugin-transform-modules-umd"],
});
Options
moduleIds
boolean par défaut !!moduleId
Ajouté dans : v7.9.0
Active la génération d'ID de module.
moduleId
string
Ajouté dans : v7.9.0
Un ID fixe à utiliser pour le module. Ne peut pas être utilisé avec getModuleId.
getModuleId
(name: string) => string
Ajouté dans : v7.9.0
Étant donné le nom de module généré par Babel, retourne le nom à utiliser. Retourner une valeur falsy utilisera le name original.
moduleRoot
string
Ajouté dans : v7.9.0
Un chemin racine à inclure dans les noms de modules générés.
Pour les options non listées ici, voir les options de @babel/plugin-transform-modules-commonjs.