带有eslint-config-airbnb扩展名为'.js'的文件中不允许JSX


102

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

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

不幸的是,当我插入一个带有React JSX代码的.js文件时,出现以下错误:

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

如前所述,是否已将eslint-config-airbnb配置为支持JSX?

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

Answers:


224

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

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

1
如果您不想更改文件扩展名或禁用规则,请参见此答案
M Falanga

此接受的答案不会禁用该规则。它只是简单地允许.js文件包含JSX,而您链接的内容似乎在超大型项目中造成了太多混乱。
JanithaR

数组中的第二个“ jsx”元素是不必要的。“ js”元素已足够,因为该规则已引用“ jsx”范围。
Raymond Wachaga

17

对我来说有用。希望对您有所帮助。

  1. 在禁用jsx-filename-extension .eslintrc

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

  2. webpack.config.js

    解析:{扩展名:['.js','.jsx']},


2
投票给您添加webpack.config.js示例。
像素

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 18/09/18

我同意这种技术不是惯用的React。但是,我仅在入口点遇到过此问题。我不建议在所有文件中执行此操作,因为这会导致代码笨拙。如果这是您的用例,则只需按照接受的答案中的建议修改短绒规则即可。
M法兰加

2

为了解释马丁的答案,目前似乎无法JSX在React Native中使用。 创建PR时由于对碎片的担忧和发生类似事情的未知后果而撤销了PRindex.ios.jsx。我不确定AirBnb如何解决这个问题或是否可以解决问题,但是我基本上使用了与rulesMartin 相同的代码块。


2

遵循React文档

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

遵循Airbnb的风格指南

除非要从非JSX的文件初始化应用程序,否则请不要使用React.createElement 。

您可以这样做:

    //index.js
    const app = React.createElement(App);
    ReactDOM.render(app, document.getElementById('root'));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.