Webpack Babel 6 ES6デコレーター


101

ES6でwebpackを私のバンドラーとして作成したプロジェクトがあります。ほとんどのトランスパイルは問題なく動作しますが、デコレータをどこかに含めようとすると、次のエラーが発生します。

Decorators are not supported yet in 6.x pending proposal update.

私はbabelの課題追跡を調べましたが、そこで何も見つけることができなかったので、間違って使用していると思います。私のwebpack設定(関連ビット):

loaders: [
  {
    loader: 'babel',
    exclude: /node_modules/,
    include: path.join(__dirname, 'src'),
    test: /\.jsx?$/,
    query: {
      plugins: ['transform-runtime'],
      presets: ['es2015', 'stage-0', 'react']
    }
  }
]

私は他に何も問題はありません、矢印関数、すべての構造を正常に解体すること、これが機能しない唯一のものです。

私はいつでも以前に動作していたbabel 5.8にいつでもダウングレードできることを知っていますが、これを現在のバージョン(v6.2.0)で動作させる方法がある場合は役立ちます。


私はステージ0プリセットを含めたので、それらは正しく変換されると思いました。デコレータはステージ1プリセットの一部であり、トランスフォームデコレータを含める必要があります。バベルのウェブサイトに書かれています。
パブリン2015年

@Pavlinこれがの順序に問題があるかどうか考えていpresetsます。
スルタン2015年

それかもしれないと思ったのですが、もう一度試しました。どのように言ってもエラーになります。どうやら順序は重要ですが、ここでは問題ではないと思います。
パブリン2015年

回答:


170

このBabelプラグインは私にとってはうまくいきました:

https://github.com/loganfsmyth/babel-plugin-transform-decorators-legacy

npm i --save-dev babel-plugin-transform-decorators-legacy

.babelrc

{
  "presets": ["es2015", "stage-0", "react"],
  "plugins": [
    ["transform-decorators-legacy"],
    // ...
  ]
}

または

Webpack

{
  test: /\.jsx?$/,
  loader: 'babel',
  query: {
    cacheDirectory: true,
    plugins: ['transform-decorators-legacy' ],
    presets: ['es2015', 'stage-0', 'react']
  }
}

リアクトネイティブ

react-nativeあなたが使用しなければならないbabel-preset-react-native-stage-0代わりに、プラグインを。

npm i --save babel-preset-react-native-stage-0

.babelrc

{
  "presets": ["react-native-stage-0/decorator-support"]
}

詳細については、この質問と回答をご覧ください。


プラグインのみを有効にしたくないでしょうdevelopment
loganfsmyth

@loganfsmythに感謝します。私は含めるように答えを更新しましたproductionとしても
カイルフィンリー

1
つまり、なぜそれをenvブロックに入れるのですか?plugins兄弟として持つことができますpresets
loganfsmyth

1
@ am5255、それはまだ私のために働いているようです。著者に問題を提出していただけませんか?github.com/loganfsmyth/babel-plugin-transform-decorators-legacy/...
カイルフィンリー

1
ようやくこれを機能させることができました。私が判明し、インストールする必要がありましたtransform-class-properties井戸としてbabeljs.io/docs/plugins/transform-class-propertiesともにドキュメントごとにクラスプラグインを変換する前に、従来のプラグインがあることを確認してくださいgithub.com/loganfsmyth/babel-plugin- transform-decorators-legacy
reectrix 2016

41

babeljs slack webchatで5分間費やした後、現在のバージョンのbabel(v6.2)ではデコレーターが壊れていることがわかりました。現時点での唯一の解決策は、5.8にダウングレードすることです。

また、問題トラッカーをgithubからhttps://phabricator.babeljs.ioに移動したようです

何時間も検索した結果、現在のドキュメントが非常に貧弱で不足していることがわかったので、私はこれらすべてを書き留めます。


6
その問題から、「制限付きベストエフォート」レガシープラグインが作成されました。制限についてはreadmeを参照してください:npmjs.com/package/babel-plugin-transform-decorators-legacy
Jason

従来の変換デコレータが暫定的な解決策として機能していることを確認できます。
dvlsg

@Pavlin、あなたの答えは正しかったかもしれませんが、以下にリストされたプラグインは今のところ受け入れられた答えであるはずです。
Ajax

8

インストールだけでbabel-plugin-transform-decorators-legacyはうまくいきませんでした(カルマと一緒に酵素を使用する構成があります)。インストール判明transform-class-properties-変換クラスのプロパティともでドキュメントごとにクラスプラグインを変換する前に、従来のプラグインがあることを確認して作っ変換-デコレータレガシーは、最終的にそれが私のために働かせました。

私も.babelrcファイルを使用していませんが、これをkarma.conf.jsファイルに追加するとうまくいきました:

babelPreprocessor: {
  options: {
    presets: ['airbnb', 'es2015', 'stage-0', 'react'],
    plugins: ["transform-decorators-legacy", "transform-class-properties"]
  }
}

ローダーにも追加しました:

loaders: [
  {
    test: /\.js$/,
    loader: 'babel',
    exclude: path.resolve(__dirname, 'node_modules'),
    query: {
      presets: ['airbnb', 'es2015', 'stage-0', 'react'],
      plugins: ["transform-decorators-legacy", "transform-class-properties"]
    }
  },

1
あちこちで1時間過ごすと、このことがうまくいきました。おかげで
たくさん

3

トランスフォームデコレータプラグインが必要なだけです:http : //babeljs.io/docs/plugins/transform-decorators/


1
それでも私にとっては失敗しました。
amcdnl 2015

3
-私の印象@amcdnlデコレータは、プラグイン変換その間、これはそこにある中で、公式の一つですが、原因TC39の制約のために実装されていないままということですgithub.com/loganfsmyth/babel-plugin-transform-decorators-legacy
Qiming

@Qiming yupそれは私が最終的に使用したものであり、babelの担当者は、もし
あなたが

1

プロジェクトをBabel 6からBabel 7にアップグレードした場合は、をインストールし@babel/plugin-proposal-decoratorsます。

Babel 5で使用されているレガシーデコレーターをサポートする場合は.babelrc、次のように構成する必要があります。

plugins: [
      ['@babel/plugin-proposal-decorators', { legacy: true }],
      ['@babel/plugin-proposal-class-properties', { loose: true }],
]

後者を使用する場合は、必ず@babel/plugin-proposal-decorators@babel/plugin-proposal-class-propertiesに来てください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.