Webpack babel 6 décorateurs ES6

101

J'ai un projet écrit en ES6 avec webpack comme bundler. La plupart des transpilages fonctionnent bien, mais lorsque j'essaye d'inclure des décorateurs n'importe où, j'obtiens cette erreur:

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

J'ai regardé le suivi des problèmes de Babel et je n'ai rien trouvé dessus, donc je suppose que je l'utilise mal. Ma configuration webpack (les bits pertinents):

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

Je n'ai aucun problème avec quoi que ce soit d'autre, les fonctions fléchées, la déstructuration tout fonctionne bien, c'est la seule chose qui ne fonctionne pas.

Je sais que je pourrais toujours revenir à Babel 5.8 où je l'avais fonctionné il y a quelque temps, mais s'il y a un moyen de faire fonctionner cela dans la version actuelle (v6.2.0), cela aiderait.

Pavlin
la source
J'ai pensé depuis que j'ai inclus le préréglage stage-0, qu'ils seraient transformés. Les décorateurs font partie du préréglage de l'étape 1 qui devrait inclure les décorateurs de transformation. Comme écrit sur le site Web de babel.
Pavlin
@Pavlin Je me demande si cela pourrait être un problème avec la commande de presets.
Sulthan du
Je pensais que c'était peut-être ça, mais je l'ai testé à nouveau. Quoi qu'il en soit, je reçois une erreur. Apparemment, l'ordre importe, mais je ne pense pas que ce soit le problème ici.
Pavlin

Réponses:

170

Ce plugin Babel a fonctionné pour moi:

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

ou

Webpack

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

Réagir natif

Avec react-nativevous devez utiliser le babel-preset-react-native-stage-0plugin à la place.

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

.babelrc

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

Veuillez voir cette question et réponse pour une explication complète.

Kyle Finley
la source
Vous ne voudriez probablement pas que le plugin soit activé uniquement pour development.
loganfsmyth
Merci @loganfsmyth. J'ai mis à jour la réponse pour inclure productionégalement
Kyle Finley
1
Je veux dire, pourquoi le mettre dans un envbloc? Vous pouvez avoir pluginscomme frère ou sœur depresets
loganfsmyth
1
@ am5255, cela semble toujours fonctionner pour moi. Pourriez-vous soumettre un problème avec l'auteur? github.com/loganfsmyth/babel-plugin-transform-decorators-legacy/…
Kyle Finley
1
A finalement réussi à faire fonctionner cela. Il se trouve que je devais installer transform-class-propertiesainsi babeljs.io/docs/plugins/transform-class-properties et assurez - vous que le plugin héritage est avant la transformation plugin classe selon les documents dans github.com/loganfsmyth/babel-plugin- transform-decorators-legacy
reectrix
41

Après avoir passé 5 minutes sur le webchat slack de babeljs, j'ai découvert que les décorateurs sont cassés dans la version actuelle de babel (v6.2). La seule solution semble être de passer à 5,8 pour le moment.

Il semblerait également qu'ils aient déplacé leur suivi des problèmes de github vers https://phabricator.babeljs.io

J'écris tout cela, car après des heures de recherche, j'ai trouvé la documentation actuelle très pauvre et manquante.

Pavlin
la source
6
À partir de ce problème, un ancien plugin "au mieux avec limitations" a été créé. Consultez le fichier Readme
Jason
Je peux confirmer que l'héritage des décorateurs de transformation fonctionne pour moi comme une solution provisoire.
dvlsg
@Pavlin, bien que votre réponse ait pu être correcte, le plugin ci-dessous devrait être la réponse acceptée pour le moment.
Ajax
8

L'installation babel-plugin-transform-decorators-legacyne fonctionnait pas pour moi (j'ai une configuration utilisant l'enzyme avec le karma). Il s'avère que l'installation transform-class-properties: transform-class-properties et s'assurer que le plug-in hérité est avant le plug-in de classe de transformation selon les documents dans transform-decorators-legacy a finalement fait fonctionner pour moi.

Je n'utilise pas non plus de .babelrcfichier, mais l'ajout de ceci à mon karma.conf.jsfichier a fonctionné pour moi:

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

Je l'ai également ajouté à mes chargeurs:

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"]
    }
  },
reectrix
la source
1
Passez une heure ici et là et cela a fonctionné pour moi. Merci beaucoup
cjmling
3

Vous avez juste besoin d'un plugin de décorateurs de transformation: http://babeljs.io/docs/plugins/transform-decorators/

encore un
la source
1
Échec toujours pour moi avec ça.
amcdnl
3
@amcdnl mon impression est que le plugin transform decorators est le plugin officiel mais laissé non implémenté en raison des contraintes TC39, en attendant il y a ceci - github.com/loganfsmyth/babel-plugin-transform-decorators-legacy
Qiming
@Qiming yup c'est ce que j'ai fini par utiliser et le fonctionnaire de babel dit même que si vous creusez assez loin ... idée assez terrible de leur part imo
amcdnl
1

Si vous avez mis à niveau votre projet de Babel 6 vers Babel 7, vous souhaitez installer @babel/plugin-proposal-decorators.

Si vous souhaitez prendre en charge les décorateurs hérités utilisés dans Babel 5, vous devez configurer votre .babelrccomme suit:

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

Assurez-vous qu'il @babel/plugin-proposal-decoratorsvient avant @babel/plugin-proposal-class-propertiesdans le cas où vous utilisez ce dernier.

codejockie
la source