Webpack babel 6 decoratori ES6


101

Ho un progetto scritto in ES6 con webpack come bundler. La maggior parte del transpiling funziona bene, ma quando provo a includere decoratori ovunque, ottengo questo errore:

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

Ho esaminato il tracker dei problemi di babel e non sono stato in grado di trovare nulla su di esso, quindi presumo che lo stia usando in modo sbagliato. La mia configurazione del webpack (i bit rilevanti):

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

Non ho problemi con nient'altro, le funzioni delle frecce, la destrutturazione funzionano bene, questa è l'unica cosa che non funziona.

So che potrei sempre eseguire il downgrade a babel 5.8 dove funzionava qualche tempo fa, ma se c'è un modo per farlo funzionare nella versione corrente (v6.2.0), sarebbe d'aiuto.


Da quando ho incluso il preset stage-0 ho pensato che si sarebbero trasformati correttamente. I decoratori fanno parte del preset della fase 1 che dovrebbe includere i decoratori di trasformazione. Come scritto sul sito web di Babele.
Pavlin

@Pavlin, sto pensando se questo potrebbe essere un problema con l'ordinamento di presets.
Sulthan

Ho pensato che potesse essere quello, ma l'ho provato di nuovo. In ogni caso, ricevo un errore. Apparentemente l'ordine ha importanza, ma non credo che questo sia il problema qui.
Pavlin

Risposte:


170

Questo plugin Babel ha funzionato per me:

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

o

Webpack

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

React Native

Con react-nativeè invece necessario utilizzare il babel-preset-react-native-stage-0plugin.

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

.babelrc

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

Si prega di consultare questa domanda e risposta per una spiegazione completa.


Probabilmente non vorresti che il plugin abilitato solo per development.
loganfsmyth

Grazie @loganfsmyth. Ho aggiornato la risposta per includere productionanche
Kyle Finley

1
Voglio dire, perché metterlo in un envblocco? Puoi avere pluginscome fratello dipresets
loganfsmyth

1
@ am5255, sembra ancora funzionare per me. Ti dispiacerebbe inviare un problema con l'autore? github.com/loganfsmyth/babel-plugin-transform-decorators-legacy/…
Kyle Finley,

1
Finalmente sono riuscito a farlo funzionare. Risulta che ho dovuto installare transform-class-propertiesanche babeljs.io/docs/plugins/transform-class-properties e assicurarmi anche che il plug-in legacy sia prima del plug-in della classe di trasformazione come da documenti in github.com/loganfsmyth/babel-plugin- transform-decorators-legacy
reectrix

41

Dopo aver trascorso 5 minuti sulla webchat slack di babeljs, ho scoperto che i decoratori non funzionano nella versione corrente di babel (v6.2). L'unica soluzione sembra essere il downgrade a 5.8 in questo momento.

Sembrerebbe anche che abbiano spostato il tracker dei problemi da github a https://phabricator.babeljs.io

Scrivo tutto questo, poiché dopo ore di ricerca ho trovato la documentazione attuale molto scarsa e carente.


6
Da quel numero, è stato creato un plug-in legacy "best-effort with limits". Vedi il file readme per le limitazioni: npmjs.com/package/babel-plugin-transform-decorators-legacy
Jason

Posso confermare che l'eredità dei trasformatori di decorazione sta funzionando per me come una soluzione provvisoria.
dvlsg

@Pavlin, anche se la tua risposta potrebbe essere corretta, il plugin elencato di seguito dovrebbe essere la risposta accettata per ora.
Ajax

8

L'installazione babel-plugin-transform-decorators-legacynon ha funzionato solo per me (ho una configurazione che utilizza l'enzima insieme al karma). Si scopre che l'installazione di transform-class-properties: transform-class-properties e anche assicurandosi che il plug-in legacy sia prima del plug-in della classe di trasformazione come da documenti in transform-decorators-legacy ha finalmente fatto funzionare per me.

Inoltre non sto usando un .babelrcfile, ma aggiungerlo al mio karma.conf.jsfile ha funzionato per me:

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

L'ho aggiunto anche ai miei caricatori:

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
Trascorri un'ora qua e là e queste cose hanno funzionato per me. Grazie
mille

3

Hai solo bisogno di un plugin per decoratori di trasformazione: http://babeljs.io/docs/plugins/transform-decorators/


1
Ancora fallito per me con quello.
amcdnl

3
@amcdnl la mia impressione è che il plugin transform decorators sia quello ufficiale ma non è stato implementato a causa dei vincoli TC39, nel frattempo c'è questo - github.com/loganfsmyth/babel-plugin-transform-decorators-legacy
Qiming

@Qiming yup questo è quello che ho finito per usare e il funzionario di babel dice anche che se scavi abbastanza lontano .. un'idea piuttosto terribile da parte loro imo
amcdnl

1

Se hai aggiornato il tuo progetto da Babel 6 a Babel 7, allora vuoi installarlo @babel/plugin-proposal-decorators.

Se vuoi supportare i decoratori legacy come quelli usati in Babel 5, devi configurare il tuo .babelrccome segue:

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

Assicurati che @babel/plugin-proposal-decoratorsvenga prima @babel/plugin-proposal-class-propertiesnel caso in cui stai facendo uso di quest'ultimo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.