136

我已经安装了应该为 React 预配置 ESLINT 的eslint-config-airbnb :

我们的默认导出包含我们所有的 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?

应该怎么做才能消除该错误?

4

7 回答 7

290

将文件扩展名更改.jsx为如上所述或禁用jsx-filename-extension规则。您可以将以下内容添加到您的配置中以允许.jsJSX 扩展。

"rules": {
  "react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }],
}
于 2017-03-26T16:14:24.860 回答
28

这对我有用。希望能帮到你。

  1. 在以下位置禁用 jsx-filename-extension .eslintrc

    “规则”:{“react/jsx-filename-extension”:[0] }

  2. webpack.config.js

    解决:{ extensions: ['.js', '.jsx'] },

于 2018-03-27T06:32:54.420 回答
11

如果它不适合你,就叫我傻瓜

    "rules": {
        "react/jsx-filename-extension": [0],
        "import/extensions": "off"
    }
于 2019-06-21T16:13:52.633 回答
6

如果您不想更改文件扩展名,可以导出一个返回 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);
于 2018-08-17T13:54:44.963 回答
4

遵循React 文档

每个 JSX 元素只是调用 React.createElement(component, props, ...children) 的语法糖。

遵循Airbnb 的风格指南

不要使用 React.createElement除非你从一个不是 JSX 的文件初始化应用程序

你可以这样做:

    //index.js
    const app = React.createElement(App);
    ReactDOM.render(app, document.getElementById('root'));
于 2019-10-12T07:51:28.070 回答
2

为了解释马丁的回答,目前似乎不可能JSX在 React Native 中使用。 一个 PR被创建,但由于担心碎片化和拥有类似index.ios.jsx. 我不确定 AirBnb 是如何解决这个问题的,或者他们是否这样做,但我使用的rules块与 Martin 基本相同。

于 2017-10-18T21:01:32.037 回答
-1

对于想要在.js文件中编写 jsx 的未来读者:

  1. npm i react react-dom即使你认为你没有写反应,也要安装。
  2. 安装npm i -D @babel/preset-react
  3. 在 babel 配置中:plugins: ['@babel/plugin-transform-react-jsx']
  4. 你应该设置module.rules文件/\.jsx?$/babel-loader所以你也需要安装npm i -D babel-loader
于 2022-02-20T11:11:11.957 回答