104 votes

Erreur de syntaxe - La prise en charge de la syntaxe expérimentale "decorators-legacy" n'est pas encore activée.

J'essaie de construire un projet JS react avec des décorateurs. Mon .babelrc ressemble à ceci :

{
  "presets": [
    "@babel/preset-env",
    "@babel/preset-react",

  ],
  "plugins": [
    "@babel/plugin-transform-runtime",
    "@babel/plugin-transform-object-assign",
    [
      "@babel/plugin-proposal-decorators",
      {
        "legacy": true
      }
    ],
    ["@babel/plugin-proposal-class-properties", { "loose": true }]
  ]
}

L'ajout du problème @babel/plugin-proposal-decorators apparaît à nouveau.

J'utilise babel 7, webpack 4 et react 16.5.

webpack.config.js :

const path = require("path");
const webpack = require("webpack");
const componentName = "reports-desktop";
const publicFolderRelativePath = "../../../../../../public/js";
const ignorePlugin = new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/);

module.exports = {
    entry: './reports-desktop.js'
    ,
    output: {
        path: path.resolve(__dirname, publicFolderRelativePath),
        filename: `${componentName}.js`
    },
    module: {
        rules: [
            {
                test: /\.js$/,
                exclude: /node_modules/,
                use: {
                    loader: "babel-loader"
                }
            }
        ]
    },
    plugins: [
        ignorePlugin
    ]
};

package.json :

{
  "name": "captain",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "watch": "webpack -w --mode development --progress --color --display-error-details",
    "build": "webpack --mode production"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@babel/core": "^7.0.0",
    "@babel/plugin-proposal-class-properties": "^7.0.0",
    "@babel/plugin-proposal-decorators": "^7.0.0",
    "@babel/plugin-transform-object-assign": "^7.0.0",
    "@babel/plugin-transform-runtime": "^7.0.0",
    "@babel/preset-env": "^7.0.0",
    "@babel/preset-react": "^7.0.0",
    "@babel/preset-stage-1": "^7.0.0",
    "@babel/preset-stage-2": "^7.0.0",
    "babel-loader": "^8.0.2",
    "babel-plugin-transform-decorators": "^6.24.1",
    "react": "^16.5.0",
    "react-dom": "^16.5.0",
    "react-redux": "^5.0.7",
    "react-router-dom": "^4.3.1",
    "redux": "^4.0.0",
    "webpack": "^4.17.3",
    "webpack-cli": "^3.1.0"
  },
  "dependencies": {
    "axios": "^0.18.0",
    "dropzone": "^5.5.1",
    "lodash": "^4.17.10",
    "moment": "^2.22.2",
    "prop-types": "^15.6.2",
    "react-addons-update": "^15.6.2",
    "react-bootstrap": "^0.32.4",
    "react-datetime": "^2.15.0",
    "react-dnd": "^5.0.0",
    "react-dnd-html5-backend": "^5.0.1",
    "react-media": "^1.8.0",
    "react-tooltip": "^3.8.1"
  }
}

Est-ce que j'utilise peut-être mal @babel/plugin-proposal-decorators ? Comme il est indiqué dans la documentation, cela devrait résoudre mon problème, mais il apparaît toujours.

0 votes

Avez-vous résolu le problème ? La configuration me semble bonne. Je déboguerais ce qui se passe en me basant sur la trace de la pile d'erreurs.

1 votes

Non :/ J'ai essayé de mettre à jour mon projet vers babel 7, mais je n'ai pas réussi à cause des décorateurs. Le problème est que j'ai importé le fichier avec les décorateurs, donc je n'avais pas le contrôle total sur ce composant. (Je ne pouvais pas toucher ce composant car d'autres projets l'utilisaient - mauvais ? - Oui)

2 votes

L'installation par npm de @babel/plugin-proposal-decorators et l'ajout de ["@babel/plugin-proposal-decorators", { "legacy" : true }] à ma configuration webpack dans la section babel plugins a suffi à résoudre le problème pour moi. Je me demande si votre .bablerc n'est pas récupéré d'une manière ou d'une autre. La différence est que je n'ai pas de .baberc et que toutes les options babel sont spécifiées dans mon webpack (j'ai utilisé create-react-app et ejected).

98voto

J'ai eu le même problème, mais j'ai pu le faire fonctionner en exécutant npm install --save-dev @babel/plugin-proposal-decorators et en ajoutant ["@babel/plugin-proposal-decorators", { "legacy": true }] à la section des plugins dans mon .babelrc .

La section des plugins de .babelrc pour moi, ressemble maintenant à ceci :

"plugins": [
  ["@babel/plugin-proposal-decorators", { "legacy": true }]
]

0 votes

Redémarrer le serveur. utilisé uniquement "@babel/plugin-proposal-decorators"

0 votes

Pourriez-vous jeter un coup d'œil à ce problème similaire ? J'utilise NextJS et Now.sh pour les déploiements : stackoverflow.com/questions/54332378/

0 votes

Existe-t-il un paquet non-scopé pour plugin-proposal-decorators ? J'ai rétrogradé babel vers babel 6 mais j'ai besoin de ce paquet pour utiliser mobx. Tout ce que je peux trouver est la version scopée.

18voto

ulyC Points 192

D'abord, exécutez la commande :

npm install customize-cra react-app-rewired @babel/plugin-proposal-decorators --save

Créer un nouveau fichier config-overrides.js à la racine du projet, puis exécutez ce qui suit :

const { override, addDecoratorsLegacy } = require('customize-cra');
module.exports = override(
 addDecoratorsLegacy()
 );

En outre, modifiez votre package.json fichier

"scripts": {
 "start": "react-app-rewired start",
 "build": "react-app-rewired build",
 "test": "react-app-rewired test",
 "eject": "react-app-rewired eject"
  },

puis redémarrer.

1 votes

J'utilise react-app-rewired, et cette solution fonctionne pour moi.

1 votes

Ça marche, tu m'as sauvé. Je suis coincé une demi-journée. Merci

1 votes

Cette solution a fonctionné pour moi dans un projet qui n'utilise pas Babel.

15voto

Alex Cory Points 389

Tiré de mobxjs . Si vous rencontrez toujours des problèmes, reportez-vous à ce . Cela m'a aidé.

Exemple de configuration pour babel 7, en mode hérité des décorateurs :

//.babelrc

{
    "presets": ["@babel/preset-env"],
    "plugins": [
        ["@babel/plugin-proposal-decorators", { "legacy": true }],
        ["@babel/plugin-proposal-class-properties", { "loose": true }]
    ]
}

Veuillez noter que l'ordre des plugins est important, et que plugin-proposal-decorators doit être le premier plugin de votre liste de plugins.

"devDependencies": {
    "@babel/core": "^7.1.0",
    "@babel/plugin-proposal-class-properties": "^7.1.0",
    "@babel/plugin-proposal-decorators": "^7.1.0",
    "@babel/preset-env": "^7.1.0"
}

Les décorateurs de mode non-légaux (étape 2) est un travail en cours, voir #1732

Edit : mise à jour de la configuration pour montrer la configuration non-beta pour babel 7

1 votes

Ne fonctionne pas du tout. Les deux sont configurés en packages.json y .babelrc ne change rien.

0 votes

Avez-vous essayé de le faire dans un babel.config.js ? J'avais des difficultés à le faire dans un .babelrc @Janusz'Ivellios'Kamienski

1 votes

Non, je ne l'ai pas fait, car il n'y avait pas d'explication claire sur la façon de le faire. Il n'y a que quelques bribes qui traînent et personne ne donne même d'exemple complet. React lui-même est assez facile pour commencer à travailler avec, mais aller à webpack/babel/node - oh garçon, c'est surréaliste ce qui se passe là pour un développeur ordinaire. Quoi qu'il en soit : J'ai résolu cela simplement en jetant ma configuration précédente et en configurant le projet avec l'ARC récente et les libs utilisées. Heureusement, cela a fonctionné dans mon cas.

12voto

wuliwong Points 859

J'ai corrigé cela avec yarn add @babel/plugin-proposal-decorators

J'ai ensuite ajouté ce qui suit à babel.config.js dans le plugins section :

  [
    require('@babel/plugin-proposal-decorators').default,
    {
      legacy: true
    }
  ],

Enfin, j'ai dû redémarrer mon serveur de développement webpack.


Je ne l'ai pas testé mais comme le dit @christopher bradshaw answers et selon le site web de babel si vous utilisez .babelrc pour la configuration, puis ajoutez ce qui suit au fichier "plugins" section :

  ["@babel/plugin-proposal-decorators", { "legacy": true }]

10voto

Abhay Kumar Points 3573

Si vous rencontrez cette erreur en utilisant ReactJS avec MobX, n'activez pas la syntaxe des décorateurs, mais utilisez l'utilitaire decorate intégré à MobX pour appliquer des décorateurs à vos classes/objets.

Ne le faites pas :

import { observable, computed, action } from "mobx";

class Timer {
  @observable start = Date.now();
  @observable current = Date.now();

  @computed
  get elapsedTime() {
    return this.current - this.start + "milliseconds";
  }

  @action
  tick() {
    this.current = Date.now();
  }
}

Faites :

import { observable, computed, action, decorate } from "mobx";

class Timer {
  start = Date.now();
  current = Date.now();

  get elapsedTime() {
    return this.current - this.start + "milliseconds";
  }

  tick() {
    this.current = Date.now();
  }
}
decorate(Timer, {
  start: observable,
  current: observable,
  elapsedTime: computed,
  tick: action
});

0 votes

J'ai trouvé cette réponse très utile ! J'en ai également trouvé d'autres sur le site mobX : mobx.js.org/best/decorators.html

13 votes

Il s'agit d'une solution de contournement, et non de la solution réelle au problème. Il est légitime de choisir de ne pas utiliser les décorateurs, mais si vous avez décidé d'utiliser la syntaxe des décorateurs dans votre code, vous devez mettre en place la configuration pour fonctionner avec eux, et non pas abandonner parce que l'incantation magique nécessaire est trop obscure.

1 votes

La réponse de @wuliwong pour permettre à Babel de faire son travail est ce que nous recherchons : stackoverflow.com/a/55985896/1181545

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X