Eslint-config-airbnb ile ".js" uzantılı dosyalarda JSX'e izin verilmez


105

Ben yükledim eslint-config-airbnb Tepki için yapılandırmak ESLINT öncesi gerekiyordu:

Varsayılan dışa aktarmamız, ECMAScript 6+ ve React dahil tüm ESLint kurallarımızı içerir. Eslint, eslint-plugin-import, eslint-plugin-react ve eslint-plugin-jsx-a11y gerektirir.

Benim .eslintrcyapılandırmasını uzanan:

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

Maalesef, içinde React JSX kodu bulunan bir .js dosyası linting yaparken aşağıdaki hatayı alıyorum:

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

Eslint-config-airbnb, belirtildiği gibi JSX'i destekleyecek şekilde yapılandırılmamış mıydı?

Bu hatayı gidermek için ne yapılmalı?

Yanıtlar:


229

Dosya uzantılarınızı .jsxbelirtildiği gibi değiştirin veya jsx-dosya adı-uzantı kuralını devre dışı bırakın . .jsJSX uzantılarına izin vermek için yapılandırmanıza aşağıdakileri ekleyebilirsiniz .

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

1
Dosya adı uzantınızı değiştirmek veya kuralı devre dışı bırakmak istemiyorsanız, bu cevaba
M Falanga

Kabul edilen bu cevap, kuralı devre dışı bırakmaz. Sadece .js dosyalarının JSX içermesine izin veriyor ve bağladığınız şey çok büyük ölçekli projelerde çok fazla kaos yaratıyor gibi görünüyor.
JanithaR

Dizideki ikinci "jsx" öğesi gereksizdir. Kural zaten "jsx" kapsamına başvurduğu için "js" öğesi yeterlidir.
Raymond Wachaga

17

Benim için çalışıyor. sana yardım etmeyi umuyorum.

  1. jsx-dosya-adı uzantısını şu konumda devre dışı bırakın .eslintrc:

    "kurallar": {"react / jsx-dosya-adı-uzantısı": [0]}

  2. içinde webpack.config.js:

    çözüm: {uzantılar: ['.js', '.jsx']},


2
size webpack.config.jsörnek eklemeniz için oy verdi .
pixel 67

5

Senin için işe yaramazsa bana kukla de

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

4

Dosya uzantınızı değiştirmek istemiyorsanız, jsx döndüren bir işlevi dışa aktarabilir ve ardından js dosyanızda bu işlevi içe aktarabilir ve çağırabilirsiniz.

// greeter.jsx

import React from 'react';

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

ve sonra

// index.js

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

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

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

Olumsuz oyu anlamıyorum. Daha iyi bir katkıda bulunabilmem için birisi açıklayabilir mi?
M Falaka

7
belki de bunun nedeni bu düzeltme "işe yarasa da", en iyi ihtimalle bir geçici çözüm olmasıdır. Ve projeniz boyunca birden çok JS dosyasında bir geçici çözüm eklemek, biraz karmaşık ve profesyonelce görünmüyor.
mkvlrn

Bu tekniğin deyimsel React olmadığına katılıyorum. Ancak bu problemle sadece giriş noktamla karşılaştım. Garip bir kod oluşturacağından, bunu tüm dosyalarda yapmanızı tavsiye etmem. Kullanım durumunuz buysa, kabul edilen cevapta önerilen şekilde linter kurallarını değiştirin.
M Falanga

2

Martin'in cevabını açıklamak gerekirse , şu anda JSXReact Native'de kullanmak mümkün değil gibi görünüyor . Bir PR oluşturuldu, ancak parçalanma endişeleri ve benzer şeylere sahip olmanın bilinmeyen sonuçları nedeniyle geri alındı index.ios.jsx. AirBnb'nin bunun etrafında nasıl çalıştığından veya işe yarayıp yaramadığından emin değilim, ancak temelde rulesMartin ile aynı bloğu kullandım .


2

React belgelerinin ardından :

Her JSX öğesi, React.createElement'i (component, props, ... children) çağırmak için sadece sözdizimsel şekerdir.

Airbnb'nin stil rehberini takip ederek :

Uygulamayı JSX olmayan bir dosyadan başlatmadığınız sürece React.createElement'i kullanmayın .

Bunu yapabilirsin:

    //index.js
    const app = React.createElement(App);
    ReactDOM.render(app, document.getElementById('root'));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.