Webpack Babel 6 ES6 Dekorateure

101

Ich habe ein Projekt in ES6 mit Webpack als Bundler geschrieben. Die meisten Transpilierungen funktionieren einwandfrei, aber wenn ich versuche, Dekorateure irgendwo einzuschließen, wird folgende Fehlermeldung angezeigt:

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

Ich habe mir den Babel Issue Tracker angesehen und konnte dort nichts finden. Ich gehe also davon aus, dass ich ihn falsch verwende. Meine Webpack-Konfiguration (die relevanten Bits):

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

Ich habe keine Probleme mit irgendetwas anderem, Pfeilfunktionen, die Zerstörung aller funktionieren gut, dies ist das einzige, was nicht funktioniert.

Ich weiß, ich könnte immer ein Downgrade auf Babel 5.8 durchführen, wo es vor einiger Zeit funktioniert hat, aber wenn es eine Möglichkeit gibt, dies in der aktuellen Version (v6.2.0) zum Laufen zu bringen, würde es helfen.

Pavlin
quelle
Ich dachte, seit ich das Stage-0-Preset aufgenommen habe, dass sie sich richtig verwandeln würden. Dekorateure sind Teil des Stage-1-Presets, das die Transformationsdekorateure enthalten sollte. Wie auf der Babel-Website geschrieben.
Pavlin
@Pavlin Ich denke, ob dies ein Problem bei der Bestellung von sein könnte presets.
Sulthan
Ich dachte, es könnte sein, aber ich habe es erneut getestet. Wie auch immer, ich bekomme eine Fehlermeldung. Anscheinend spielt die Reihenfolge eine Rolle, aber ich denke nicht, dass das hier das Problem ist.
Pavlin

Antworten:

170

Dieses Babel-Plugin hat bei mir funktioniert:

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

oder

Webpack

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

Native reagieren

Mit react-nativemüssen Sie babel-preset-react-native-stage-0stattdessen das Plugin verwenden.

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

.babelrc

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

Bitte lesen Sie diese Frage und Antwort für eine vollständige Erklärung.

Kyle Finley
quelle
Sie möchten wahrscheinlich nicht, dass das Plugin nur für aktiviert wird development.
Loganfsmyth
Danke @loganfsmyth. Ich habe die Antwort aktualisiert, um productionauch
einzuschließen
1
Ich meine, warum überhaupt in einen envBlock stecken? Sie können pluginsals Geschwister vonpresets
loganfsmyth
1
@ am5255, es scheint immer noch für mich zu funktionieren. Würde es Ihnen etwas ausmachen, ein Problem mit dem Autor einzureichen? github.com/loganfsmyth/babel-plugin-transform-decorators-legacy/…
Kyle Finley
1
Konnte dies endlich zum Laufen bringen. Es stellte sich heraus, dass ich transform-class-propertiesauch babeljs.io/docs/plugins/transform-class-properties installieren und sicherstellen musste, dass das Legacy-Plugin vor dem Plugin für die Transformationsklasse steht, wie in den Dokumenten unter github.com/loganfsmyth/babel-plugin- beschrieben. verwandeln-Dekorateure-Vermächtnis
reectrix
41

Nachdem ich 5 Minuten im lockeren Webchat von babeljs verbracht hatte, stellte ich fest, dass Dekorateure in der aktuellen Version von babel (v6.2) kaputt sind. Die einzige Lösung scheint zu diesem Zeitpunkt ein Downgrade auf 5.8 zu sein.

Es scheint auch, dass sie ihren Issue-Tracker von Github auf https://phabricator.babeljs.io verschoben haben

Ich schreibe das alles auf, da ich nach stundenlangem Suchen die aktuelle Dokumentation als sehr schlecht und mangelhaft empfunden habe.

Pavlin
quelle
6
Aus diesem Problem heraus wurde ein Legacy-Plugin "Best-Effort mit Einschränkungen" erstellt. Einschränkungen finden Sie in der Readme- Datei
Jason
Ich kann bestätigen, dass das Erbe des Transformationsdekorateurs für mich als Zwischenlösung funktioniert.
dvlsg
@Pavlin, obwohl Ihre Antwort möglicherweise korrekt war, sollte das unten aufgeführte Plugin vorerst die akzeptierte Antwort sein.
Ajax
8

Nur zu installieren babel-plugin-transform-decorators-legacyhat bei mir nicht funktioniert (ich habe eine Konfiguration mit Enzym zusammen mit Karma). Es stellte sich heraus, dass die Installation von transform-class-properties: transform-class-properties und die Sicherstellung, dass das Legacy-Plugin vor dem Transformationsklassen-Plugin gemäß den Dokumenten in transform-decorators-Legacy steht, endlich für mich funktioniert haben.

Ich verwende auch keine .babelrcDatei, aber das Hinzufügen zu meiner karma.conf.jsDatei hat für mich funktioniert:

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

Ich habe es auch meinen Ladern hinzugefügt:

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
quelle
1
Verbringen Sie hier und da eine Stunde und diese Dinge haben für mich funktioniert. Vielen Dank
cjmling
3

Sie benötigen lediglich ein Plugin für Transformationsdekorateure: http://babeljs.io/docs/plugins/transform-decorators/

noch einer
quelle
1
Immer noch gescheitert für mich w / das.
Amcdnl
3
@amcdnl Mein Eindruck ist, dass das Transform Decorators Plugin das offizielle Plugin ist, aber aufgrund von TC39-Einschränkungen nicht implementiert wurde. In der Zwischenzeit gibt es dieses - github.com/loganfsmyth/babel-plugin-transform-decorators-legacy
Qiming
@Qiming yup das ist, was ich am Ende verwendet habe und Babel Official sagt sogar, wenn Sie weit genug graben .. ziemlich schreckliche Idee von ihrer Seite imo
amcdnl
1

Wenn Sie Ihr Projekt von Babel 6 auf Babel 7 aktualisiert haben, möchten Sie es installieren @babel/plugin-proposal-decorators.

Wenn Sie ältere Dekorateure unterstützen möchten, wie sie in Babel 5 verwendet werden, müssen Sie Ihre .babelrcwie folgt konfigurieren :

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

Stellen Sie sicher, dass dies für den Fall, dass Sie letzteres verwenden, @babel/plugin-proposal-decoratorsvorher erfolgt @babel/plugin-proposal-class-properties.

Codejockie
quelle