web-dev-qa-db-ja.com

JSXは、eslint-config-airbnbの拡張子が「.js」のファイルでは許可されません

eslint-config-airbnb をインストールしました。これは、React用にESLINTを事前に構成することになっています。

デフォルトのエクスポートには、ECMAScript 6+やReactを含むすべてのESLintルールが含まれています。 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をサポートするように設定されていませんでしたか?

そのエラーを削除するにはどうすればよいですか?

68
Mendes

前述のようにファイル拡張子を.jsxに変更するか、 jsx-filename-extension ルールを無効にします。以下を構成に追加して、JSXの.js拡張を許可できます。

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

それは私の仕事です。あなたを助けることを願っています。

  1. .eslintrcでjsx-filename-extensionを無効にします:

    「ルール」:{"react/jsx-filename-extension":[0]}

  2. webpack.config.jsで:

    解決:{拡張子:['.js'、 '.jsx']}、

11
Willard Wong

ファイル拡張子を変更したくない場合は、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);
3
M Falanga

Martin's の答えを説明すると、現在、React NativeでJSXを使用することはできないようです。 A PR は作成されましたが、断片化の懸念とindex.ios.jsxのようなものを持つことの未知の結果のために元に戻されました。 AirBnbがこの問題をどのように回避するか、または機能するかどうかはわかりませんが、基本的にはMartinと同じrulesブロックを使用しています。

2
Adam burdette