JSX не дозволений у файлах із розширенням '.js' із eslint-config-airbnb


102

Я встановив eslint-config-airbnb, який повинен попередньо налаштувати ESLINT для React:

Наш експорт за замовчуванням містить усі наші правила ESLint, включаючи ECMAScript 6+ та React. Для цього потрібні eslint, eslint-plugin-import, eslint-plugin-react та eslint-plugin-jsx-a11y.

Моя .eslintrcрозширення його конфігурації:

{ "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
  }
}

На жаль, я отримую таку помилку під час з'єднання .js-файлу з кодом React JSX всередині нього:

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

Хіба вже не налаштовано eslint-config-airbnb на підтримку JSX, як зазначено?

Що потрібно зробити, щоб усунути цю помилку?

Відповіді:


224

Змініть розширення файлів на .jsxвказані вище або відключіть правило jsx-filename-extension . Ви можете додати до конфігурації наступне, щоб дозволити .jsрозширення для JSX.

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

1
Якщо ви не хочете змінювати розширення назви файлу або відключати правило, дивіться цю відповідь
M Falanga

Ця прийнята відповідь не вимикає правило. Він просто дозволяє .js файлам містити JSX, а те, що ви пов’язали, створює занадто великий хаос у дуже масштабних проектах.
JanithaR

Другий елемент "jsx" у масиві непотрібний. Елементу "js" достатньо, оскільки правило вже посилається на область "jsx".
Реймонд Вачага

17

Це для мене робота. сподіваюся вам допомогти.

  1. відключити jsx-filename-extension у .eslintrc:

    "правила": {"react / jsx-filename-extension": [0]}

  2. в webpack.config.js:

    рішення: {extensions: ['.js', '.jsx']},


2
дали вам голос за додавання webpack.config.jsприкладу.
піксель 67

5

Називай мене манекена, якщо це не працює для тебе

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

4

Якщо ви не хочете змінювати розширення файлу, ви можете експортувати функцію, яка повертає jsx, а потім імпортувати та викликати цю функцію у вашому js-файлі.

// greeter.jsx

import React from 'react';

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

і потім

// index.js

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

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

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

Я не розумію протиправного голосу. Хтось може пояснити, щоб я міг стати кращим внеском?
M Falanga

7
можливо, це тому, що, хоча це виправлення "працює", воно, в кращому випадку, є вирішенням проблеми. І включення вирішення в декількох файлах JS протягом вашого проекту виглядає начебто хитким і непрофесійним.
mkvlrn

Я погоджуюся, що ця методика не є ідіоматичною Реакцією. Однак я зіткнувся з цією проблемою лише з моєю точкою входу. Я б не рекомендував робити це у всіх файлах, оскільки це створить незручний код. Якщо це ваш випадок використання, просто змініть правила лінійки, як запропоновано у прийнятій відповіді.
М Фаланга

2

Якщо пояснити відповідь Мартіна , здається, що наразі це неможливо використовувати JSXв React Native. PR був створений, але скасований через занепокоєння щодо фрагментації та невідомих наслідків подібних речей index.ios.jsx. Я не впевнений, як AirBnb працює навколо цього чи якщо вони є, але я в основному використовував той самий rulesблок, що і Мартін.


2

Наступна документація React :

Кожен елемент JSX - це просто синтаксичний цукор для виклику React.createElement (компонент, реквізит, ... діти).

Дотримуючись посібника зі стилю Airbnb :

Не використовуйте React.createElement, якщо ви не ініціалізуєте додаток з файлу, який не є JSX .

Ви можете зробити це:

    //index.js
    const app = React.createElement(App);
    ReactDOM.render(app, document.getElementById('root'));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.