@babel/plugin-transform-modules-umd
履歴
バージョン | 変更点 |
---|---|
v7.14.0 | importInterop オプションを実装 |
このプラグインは、modules
オプションの下で@babel/preset-env
に含まれています。
このプラグインは、ES2015 モジュールをUMDに変換します。 Babel は ES2015 モジュールと UMD の実装間の異なる解決アルゴリズムを認識していないため、import/export 文 (import "./mod.js"
) の *構文* だけが変換されることに注意してください。
⚠️ このプラグインは動的 import (import('./lazy.js')
) をサポートしていません。
例
入力
export default 42;
出力
(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;
});
インストール
- npm
- Yarn
- pnpm
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
使用方法
設定ファイルを使用する場合 (推奨)
{
"plugins": ["@babel/plugin-transform-modules-umd"]
}
このモジュールがブラウザで実行されている場合、特定のライブラリの名前をオーバーライドすることもできます。たとえば、es6-promise
ライブラリは、global.es6Promise
ではなくglobal.Promise
として公開されます。これは次のように対応できます。
{
"plugins": [
[
"@babel/plugin-transform-modules-umd",
{
"globals": {
"es6-promise": "Promise"
}
}
]
]
}
デフォルトのセマンティクス
デフォルトのセマンティクスには、いくつかの注意点があります。
第一に、この変換は、UMD 出力でのグローバル名の生成に、各 import のbasenameを使用します。つまり、次のように、同じ basename を持つ複数のモジュールをインポートする場合、
import fooBar1 from "foo-bar";
import fooBar2 from "./mylib/foo-bar";
同じブラウザグローバルへの2つの参照に変換されます。
factory(global.fooBar, global.fooBar);
プラグインオプションを次のように設定した場合、
{
"globals": {
"foo-bar": "fooBAR",
"./mylib/foo-bar": "mylib.fooBar"
}
}
それでも両方とも1つのブラウザグローバルに変換されます。
factory(global.fooBAR, global.fooBAR);
これは、変換が import の basename だけを使用しているためです。
第二に、指定されたオーバーライドは、babel-types/src/convertersのtoIdentifier
関数に渡されます。つまり、次のようにメンバ式としてオーバーライドを指定した場合、
{
"globals": {
"fizzbuzz": "fizz.buzz"
}
}
factory(global.fizz.buzz)
には変換されません。代わりに、toIdentifier
内のロジックに基づいて、factory(global.fizzBuzz)
に変換されます。
第三に、エクスポートされたグローバル名をオーバーライドすることはできません。
exactGlobals: true
によるより柔軟なセマンティクス
これらの動作はすべて、globals
マップの柔軟性を制限する可能性があります。これらの制限を解除するには、exactGlobals
オプションをtrue
に設定します。これにより、プラグインは
- グローバル名の生成時に、常にbasenameの代わりに完全なimport文字列を使用します。
globals
オーバーライドをtoIdentifier
関数に渡すことをスキップします。代わりに、記述どおりに正確に使用されるため、有効な識別子または有効な非計算(ドット)メンバ式を使用しない場合はエラーが発生します。globals
マップを介してエクスポートされたグローバル名をオーバーライドすることを許可します。オーバーライドは、有効な識別子または有効なメンバ式である必要があります。
したがって、exactGlobals
をtrue
に設定し、オーバーライドを渡さない場合、最初の例は
import fooBar1 from "foo-bar";
import fooBar2 from "./mylib/foo-bar";
次のように変換されます。
factory(global.fooBar, global.mylibFooBar);
そして、プラグインオプションを次のように設定した場合、
{
"globals": {
"foo-bar": "fooBAR",
"./mylib/foo-bar": "mylib.fooBar"
},
"exactGlobals": true
}
次のように変換されます。
factory(global.fooBAR, global.mylib.fooBar);
最後に、プラグインオプションを次のように設定した場合、
{
"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"
}
次のように変換されます。
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;
CLI を介して
babel --plugins @babel/plugin-transform-modules-umd script.js
Node API を介して
require("@babel/core").transformSync("code", {
plugins: ["@babel/plugin-transform-modules-umd"],
});
オプション
moduleIds
boolean
デフォルトは !!moduleId
追加日: v7.9.0
モジュールIDの生成を有効にします。
moduleId
文字列
追加日: v7.9.0
モジュールに使用するハードコードされたID。getModuleId
と併用できません。
getModuleId
(name: string) => string
追加日: v7.9.0
Babel によって生成されたモジュール名を与え、使用する名前を返します。偽の値を返すと、元のname
が使用されます。
moduleRoot
文字列
追加日: v7.9.0
生成されたモジュール名に含めるルートパス。
ここにリストされていないオプションについては、@babel/plugin-transform-modules-commonjs
のオプションを参照してください。