126 votes

JSX n'est pas autorisé dans les fichiers avec l'extension ' .js' avec eslint-config-airbnb

J'ai installé eslint-config-airbnb qui est censé pré configurer ESLINT pour React :

Notre exportation par défaut contient toutes nos règles ESLint, y compris ECMAScript 6+ et React. Il nécessite eslint, eslint-plugin-import, eslint-plugin-react, et eslint-plugin-jsx-a11y.

Mon .eslintrc en étendant sa configuration :

{ "extends": "eslint-config-airbnb",
  "env": {
    "browser": true,
    "node": true,
    "mocha": true
  },
  "rules": {
    "new-cap": [2, { "capIsNewExceptions": ["List", "Map", "Set"] }],
    "react/no-multi-comp": 0,
    "import/default": 0,
    "import/no-duplicates": 0,
    "import/named": 0,
    "import/namespace": 0,
    "import/no-unresolved": 0,
    "import/no-named-as-default": 2,
    "comma-dangle": 0,  // not sure why airbnb turned this on. gross!
    "indent": [2, 2, {"SwitchCase": 1}],
    "no-console": 0,
    "no-alert": 0,
    "linebreak-style": 0
  },
  "plugins": [
    "react", "import"
  ],
  "settings": {
    "import/parser": "babel-eslint",
    "import/resolve": {
      "moduleDirectory": ["node_modules", "src"]
    }
  },
  "globals": {
    "__DEVELOPMENT__": true,
    "__CLIENT__": true,
    "__SERVER__": true,
    "__DISABLE_SSR__": true,
    "__DEVTOOLS__": true,
    "socket": true,
    "webpackIsomorphicTools": true
  }
}

Malheureusement, j'obtiens l'erreur suivante lors de la vérification d'un fichier .js contenant du code React JSX :

 error  JSX not allowed in files with extension '.js'              react/jsx-filename-extension

eslint-config-airbnb n'était-il pas déjà configuré pour supporter JSX, comme indiqué ?

Que faut-il faire pour supprimer cette erreur ?

271voto

Martin Mihaylov Points 1611

Soit vous changez vos extensions de fichiers en .jsx comme indiqué ou désactiver le jsx-filename-extension règle. Vous pouvez ajouter les éléments suivants à votre configuration pour autoriser .js extensions pour JSX.

"rules": {
  "react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }],
}

1 votes

Si vous ne voulez pas modifier l'extension de votre nom de fichier ou désactiver la règle, voir cette réponse

2 votes

Cette réponse acceptée ne désactive pas la règle. Elle permet simplement aux fichiers .js de contenir du JSX et ce que vous avez lié semble créer trop de chaos dans les projets à très grande échelle.

0 votes

Le deuxième élément "jsx" dans le tableau est inutile. L'élément "js" est suffisant puisque la règle fait déjà référence à la portée "jsx".

23voto

Willard Wong Points 119

Cela fonctionne pour moi. J'espère pouvoir vous aider.

  1. désactiver l'extension jsx-filename en .eslintrc :

    "règles" : { "react/jsx-filename-extension" : [0] }

  2. sur webpack.config.js :

    résoudre : { extensions : ['.js', '.jsx'] },

2 votes

Vous a donné le vote pour ajouter le webpack.config.js exemple.

11voto

droid Points 29

Traitez-moi d'imbécile si cela ne fonctionne pas pour vous.

    "rules": {
        "react/jsx-filename-extension": [0],
        "import/extensions": "off"
    }

5voto

M Falanga Points 84

Si vous ne voulez pas changer l'extension de votre fichier, vous pouvez exporter une fonction qui renvoie jsx, puis importer et appeler cette fonction dans votre fichier js.

// greeter.jsx

import React from 'react';

export default name => (
  <div>
    {`Hello, ${name}!`}
  </div>
);

et ensuite

// index.js

import ReactDOM from 'react-dom';
import greeter from './components/greeter';

const main = document.getElementsByTagName('main')[0];

ReactDOM.render(greeter('World'), main);

0 votes

Je ne comprends pas le downvote. Quelqu'un peut-il m'expliquer pour que je puisse être un meilleur contributeur ?

9 votes

C'est peut-être parce que, même si cette solution "fonctionne", il s'agit, au mieux, d'une solution de rechange. Et inclure une solution de contournement dans de multiples fichiers JS à travers votre projet semble un peu bricolé et non professionnel.

0 votes

Je suis d'accord que cette technique n'est pas idiomatique de React. Cependant je n'ai rencontré ce problème qu'avec mon point d'entrée. Je ne recommanderais pas de faire cela sur tous les fichiers, car cela créerait un code maladroit. Si c'est votre cas d'utilisation, alors modifiez simplement les règles de linter comme suggéré dans la réponse acceptée.

4voto

fjplaurr Points 979

Suivant Documentation sur React :

Chaque élément JSX n'est que du sucre syntaxique pour appeler React.createElement(component, props, ...children).

Suivant Le guide de style d'Airbnb :

Ne pas utiliser React.createElement à moins que vous initialisiez l'application à partir d'un fichier qui n'est pas JSX. .

Tu pourrais faire ça :

    //index.js
    const app = React.createElement(App);
    ReactDOM.render(app, document.getElementById('root'));

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