Webpack babel 6 ES6 dekoratörler


101

Paketleyicim olarak webpack ile ES6'da yazılmış bir projem var. Transpiling çoğu iyi çalışıyor, ancak dekoratörleri herhangi bir yere dahil etmeye çalıştığımda şu hatayı alıyorum:

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

Babel sorunu izleyicisine baktım ve orada hiçbir şey bulamadım, bu yüzden yanlış kullandığımı varsayıyorum. Web paketi yapılandırmam (ilgili bitler):

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

Başka hiçbir şeyle sorunum yok, ok işlevleri, tüm işleri bozmak iyi, işe yaramayan tek şey bu.

Bir süre önce çalıştırdığım Babel 5.8'e her zaman düşürebileceğimi biliyorum, ancak bunu mevcut sürümde (v6.2.0) çalıştırmanın herhangi bir yolu varsa, yardımcı olacaktır.


Aşama-0 ön ayarını dahil ettiğimden beri, niteliklerinin dönüştürüleceğini düşündüm. Dekoratörler, dönüşüm dekoratörlerini içermesi gereken 1. aşama ön ayarının bir parçasıdır. Babel web sitesinde yazıldığı gibi.
Pavlin

@Pavlin Bunun siparişi ile ilgili bir sorun olup olmadığını düşünüyorum presets.
Sulthan

Öyle olabileceğini düşündüm, ama tekrar test ettim. Herhangi bir şekilde ifade edersem bir hata alıyorum. Görünüşe göre sıra önemli, ama buradaki sorunun bu olduğunu sanmıyorum.
Pavlin

Yanıtlar:


170

Bu Babel eklentisi benim için çalıştı:

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"],
    // ...
  ]
}

veya

Web paketi

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

React Native

İle react-native kullanmanız gerekir babel-preset-react-native-stage-0bunun yerine eklentisi.

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

.babelrc

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

Lütfen tam bir açıklama için bu soruya ve cevaba bakın.


Muhtemelen eklentinin yalnızca için etkinleştirilmesini istemezsiniz development.
loganfsmyth

Teşekkürler @loganfsmyth. Yanıtı da içerecek productionşekilde güncelledim
Kyle Finley

1
Demek istediğim, neden bir envbloğa koyasın ki? pluginsKardeş olarak sahip olabilirsinizpresets
loganfsmyth

1
@ am5255, hala benim için çalışıyor gibi görünüyor. Yazarla bir sorun gönderebilir misiniz? github.com/loganfsmyth/babel-plugin-transform-decorators-legacy/…
Kyle Finley

1
Sonunda bunu çalıştırmayı başardı. I dışarı Dönüşler yüklemek zorunda transform-class-propertiessıra babeljs.io/docs/plugins/transform-class-properties ve ayrıca docs göre sınıf eklentisi dönüşümü önce eski eklentisi olduğundan emin olmak github.com/loganfsmyth/babel-plugin- transform-dekoratörler-miras
reectrix

41

Babeljs gevşek web sohbetinde 5 dakika geçirdikten sonra, babel'in şu anki sürümünde (v6.2) dekoratörlerin bozuk olduğunu öğrendim. Şu anda tek çözüm 5,8'e düşürmek gibi görünüyor.

Ayrıca sorun izleyicisini github'dan https ://phabricator.babeljs.io'ya taşıdıkları görülüyor.

Bütün bunları yazıyorum, çünkü saatlerce araştırdıktan sonra mevcut dokümantasyonu çok zayıf ve eksik buldum.


6
Bu sorundan, "sınırlamalara sahip en iyi çaba" eski eklenti yapıldı. Sınırlamalar için benioku sayfasına bakın: npmjs.com/package/babel-plugin-transform-decorators-legacy
Jason

Eski dönüşüm dekoratörlerinin benim için geçici bir çözüm olarak çalıştığını doğrulayabilirim.
dvlsg

@Pavlin, cevabınız doğru olsa da, aşağıda listelenen eklenti şimdilik kabul edilen cevap olmalıdır.
Ajax

8

Kurulum sadece babel-plugin-transform-decorators-legacybenim için işe yaramadı (karma ile birlikte enzim kullanan bir konfigürasyonum var). Yüklemeden çıkıyor transform-class-properties: -dönüşümü sınıf özellikleri ve ayrıca docs göre sınıf eklentisi dönüşümü önce eski eklentisi ettiğinden emin dönüşümü dekoratörler-mirası nihayet benim için iş yaptı.

Ayrıca bir .babelrcdosya kullanmıyorum , ancak bunu dosyama eklemek benim karma.conf.jsiçin çalıştı:

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

Bunu yükleyicilerime de ekledim:

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
Orada burada bir saat geçirin ve bu işler benim için çalıştı. Teşekkürler çok
cjmling

3

Yalnızca bir dönüşüm dekoratör eklentisine ihtiyacınız var: http://babeljs.io/docs/plugins/transform-decorators/


1
Yine de benim için başarısız oldu.
amcdnl

3
@amcdnl Benim izlenimim, dönüşüm dekoratörleri eklentisinin resmi eklenti olduğu ancak TC39 kısıtlamaları nedeniyle uygulanmadığı yönünde, bu arada şu var - github.com/loganfsmyth/babel-plugin-transform-decorators-legacy
Qiming

@Qiming yup, kullandığım şey bu ve babel yetkilisi bile diyor ki, yeterince kazarsan ... onların adına oldukça korkunç bir fikir imo
amcdnl

1

Projenizi Babel 6'dan Babel 7'ye yükselttiyseniz, yüklemek istersiniz @babel/plugin-proposal-decorators .

Eski dekoratörleri Babel 5'te kullanıldığı gibi desteklemek istiyorsanız .babelrc, aşağıdaki gibi yapılandırmanız gerekir :

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

İkincisini kullanmanız durumunda @babel/plugin-proposal-decoratorsönce geldiğinden emin olun @babel/plugin-proposal-class-properties.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.