@babel/plugin-proposal-decorators
例
シンプルなクラスデコレーター
@annotation
class MyClass {}
function annotation(target) {
target.annotated = true;
}
クラスデコレーター
@isTestable(true)
class MyClass {}
function isTestable(value) {
return function decorator(target) {
target.isTestable = value;
};
}
クラスメソッドデコレーター
class C {
message = "hello!";
@bound
m() {
console.log(this.message);
}
}
function bound(value, { name, addInitializer }) {
addInitializer(function () {
this[name] = this[name].bind(this);
});
}
インストール
- npm
- Yarn
- pnpm
npm install --save-dev @babel/plugin-proposal-decorators
yarn add --dev @babel/plugin-proposal-decorators
pnpm add --save-dev @babel/plugin-proposal-decorators
使い方
設定ファイルを使用する(推奨)
{
"plugins": [
["@babel/plugin-proposal-decorators", { "version": "2023-11" }]
]
}
Node API経由
require("@babel/core").transformSync("code", {
plugins: [
["@babel/plugin-proposal-decorators", { version: "2023-11" }],
]
});
オプション
履歴
バージョン | 変更点 |
---|---|
v7.24.0 | version: "2023-11" のサポートを追加 |
v7.22.0 | version: "2023-05" のサポートを追加 |
v7.21.0 | version: "2023-01" のサポートを追加 |
v7.19.0 | version: "2022-03" のサポートを追加 |
v7.17.0 | "2021-12" , "2018-09" , "legacy" をサポートするversion オプションを追加 |
version
"2023-11"
, "2023-05"
, "2023-01"
, "2022-03"
, "2021-12"
, "2018-09"
または "legacy"
。
使用するデコレーターの提案を選択します
"2023-11"
は、2023年11月のTC30会議で合意に達した更新後の提案バージョンで、この変更を統合しています。"2023-05"
は、2023年3月と5月のTC39会議で合意に達した更新後の提案バージョンで、これらの変更を統合しています。"2023-01"
は、2023年1月のTC39会議で合意に達した更新後の提案バージョンで、pzuraq/ecma262#4
を統合しています。"2022-03"
は、2022年3月のTC39会議でステージ3に到達した提案バージョンです。詳細については、tc39/proposal-decorators@8ca65c046d
を参照してください。"2021-12"
は、2021年12月にTC39に提示された時点の提案バージョンです。詳細については、tc39/proposal-decorators@d6c056fa06
を参照してください。"2018-09"
は、2018年9月にTC39に提示され、最初にステージ2に昇格した提案バージョンです。詳細については、tc39/proposal-decorators@7fa580b40f
を参照してください。legacy
は、wycats/javascript-decorators@e1bf8d41bf
で定義されたレガシーステージ1の提案です。レガシーモードには機能更新がなく、BabelとTypeScriptの間に既知の不一致があります。"2023-11"
の提案に移行することをお勧めします。
Babel 8は"2023-11"
と"legacy"
のみをサポートします。異なるデコレーターバージョンを使用している場合は、"2023-11"
に移行することをお勧めします。
仕様リポジトリでは、これらのバージョン間の違いの概要を提供しています。
decoratorsBeforeExport
オプションを指定した場合、version
はデフォルトで"2018-09"
になり、それ以外の場合は必須オプションです。
decoratorsBeforeExport
このオプションは
version: "legacy"
、version: "2022-03"
、version: "2023-01"
、version: "2023-05"
、またはversion: "2023-11"
を使用する場合は許可されません。version: "2018-09"
を使用する場合は必須です。version: "2021-12"
を使用する場合はオプションであり、デフォルトはfalse
です。
ブール値
// decoratorsBeforeExport: false
export @decorator class Bar {}
// decoratorsBeforeExport: true
@decorator
export class Foo {}
このオプションは、提案された構文で実験できるようにすることで、tc39がコミュニティからフィードバックを収集するのを支援するために最初に追加されました。提案は、デコレーターをexport
の前または後のいずれかに許可することで落ち着きました。
legacy
代わりにversion: "legacy"
を使用してください。このオプションはレガシーエイリアスです。
boolean
、デフォルトはfalse
。
レガシー(ステージ1)のデコレーター構文と動作を使用します。
注:@babel/plugin-transform-class-properties
との互換性
プラグインを手動で含めていて、次のようなクラス要素変換を使用している場合
@babel/plugin-transform-class-properties
@babel/plugin-transform-private-methods
@babel/plugin-transform-private-property-in-object
@babel/plugin-transform-class-static-block
@babel/plugin-proposal-decorators
がそれらの前に来るようにしてください。
{
"plugins": [
- "@babel/plugin-transform-class-properties",
["@babel/plugin-proposal-decorators", { "version": "2023-11" }]
+ "@babel/plugin-transform-class-properties"
]
}
すでに@babel/preset-env
とステージ3デコレーターを使用している場合は、クラス要素変換を安全に削除できます。Babelはプリセットの前にデコレーター変換を自動的に適用します
{
"presets": [
["@babel/preset-env"],
],
"plugins": [
- "@babel/plugin-transform-class-properties",
["@babel/plugin-proposal-decorators", { "version": "2023-11" }]
]
}
@babel/preset-env
とレガシーデコレーターを使用している場合は、ターゲットに関係なくクラス要素変換が有効になっていることを確認する必要があります。Babelは、クラスプロパティもコンパイルする場合にのみ、レガシーデコレーターのコンパイルをサポートしているためです
{
"presets": [
["@babel/preset-env", {
+ "include": [
+ "@babel/plugin-transform-class-properties"
+ ]
}],
],
"plugins": [
- "@babel/plugin-transform-class-properties",
["@babel/plugin-proposal-decorators", { "version": "legacy" }]
]
}
include
オプションを使用すると、@babel/preset-env
に含まれる変換が有効になるため、package.json
から安全に削除できます。
プラグインオプションの設定の詳細については、こちらを参照してください