Webpack babel 6 декораторів ES6


101

У мене є проект, написаний в ES6, з webpack як мій постачальник. Більшість трансліпінгу працює добре, але коли я намагаюся включати декораторів де завгодно, я отримую цю помилку:

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

Я переглянув трекер випуску вабелів, і там не зміг знайти нічого, тому припускаю, що я його неправильно використовую. Конфігурація веб-пакету (відповідні біти):

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

У мене немає проблем із чим-небудь іншим, зі стрілковими функціями, що руйнує все добре, це єдине, що не працює.

Я знаю, що завжди міг би перейти до мітки 5.8, де я працював деякий час тому, але якщо є якийсь спосіб заставити це працювати в поточній версії (v6.2.0), це допоможе.


Я думав, що з моменту включення пресету на етап 0, що вони стануть перетвореними. Декоратори є частиною попередньо встановленої сцени-1, яка повинна включати декоратори-перетворювачі. Як написано на веб-сайті бабла.
Павлін

@ Павлін Я думаю, чи це може бути проблемою з замовленням presets.
Султан

Я думав, що це може бути, але я перевірив це ще раз. Будь-який спосіб я висловлюю, я отримую помилку. Мабуть, порядок має значення, але я не думаю, що тут проблема.
Павлін

Відповіді:


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

або

Вебпак

{
  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- перетворення-декоратори-спадщина
reectrix

41

Провівши 5 хвилин на слабій веб-чаті babeljs, я з'ясував, що декоратори розбиті в поточній версії babel (v6.2). Здається, єдиним рішенням є зниження рівня до 5,8 на даний момент.

Здавалося б, вони перенесли свій трекер випуску з github на https://phabricator.babeljs.io

Я записую все це, оскільки після годин пошуку я вважаю, що поточна документація є дуже поганою і не вистачає.


6
З цього випуску було зроблено застарілий плагін "найкраще зусилля з обмеженнями". Про обмеження див. У readme: npmjs.com/package/babel-plugin-transform-decorators-legacy
Jason

Я можу підтвердити, що спадщина декораторів перетворень працює для мене як проміжне рішення.
dvlsg

@Pavlin, хоча ваша відповідь, можливо, була правильною, плагін, перелічений нижче, зараз повинен бути прийнятою відповіддю.
Аякс

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
Проведіть туди-сюди годину, і ця справа працювала на мене. Дякую багато
cymling

3

Вам просто потрібен плагін для декораторів перетворень: http://babeljs.io/docs/plugins/transform-decorators/


1
Для мене все-таки не вдалося.
amcdnl

3
@amcdnl моє враження полягає в тому, що плагін для декораторів перетворень є офіційним, але залишається без змін через обмеження TC39, тим часом є це - github.com/loganfsmyth/babel-plugin-transform-decorators-legacy
Qiming

@ Qiming yup thats що я в кінцевому підсумку використовував, а чиновник навіть каже, що якщо ви копаєте досить далеко .. досить жахлива ідея з їхнього боку imo
amcdnl

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ви користуєтесь останнім.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.