Как разрешить импорт/no-named-as-default

Посмотрев на документацию по правилу eslint для импорта/без имени как по умолчанию, я все еще смущен тем, что именно я делаю неправильно.

У меня есть следующая файловая структура

.
├── ButtonBack.css
├── ButtonBack.jsx
├── __tests__
│   └── ButtonBack.test.jsx
└── index.js

ButtonBack.jsx содержит следующий код

import React from 'react';
import PropTypes from 'prop-types';

export default class ButtonBack extends React.Component {
  ... code removed to keep example short ...
}

__ tests __/ButtonBack.test.jsx содержит следующий код

import React from 'react';
import { shallow } from 'enzyme';
import ButtonBack from '../ButtonBack'; // <== this line has an eslint warning

... code removed to keep example short ...

Проблема в том, что мой linter говорит, что import ButtonBack from '../ButtonBack нарушает следующие правила lint:

Я не могу понять, почему мой оператор импорта нарушает правило lint. Удаление имени класса в ButtonBack.jsx(export default class extends React.Component) также не решает проблему.

Ответ 1

Перейдите в эту же проблему и из того, что я вижу, вам просто нужно отключить это правило (что я сделал хотя бы)

"К сожалению, React + Redux является наиболее распространенным сценарием. Однако есть много других случаев, когда HOC заставят разработчиков закрыть это правило".

https://github.com/benmosher/eslint-plugin-import/issues/544

https://github.com/reactjs/react-redux/issues/119

https://github.com/18F/calc/pull/1235

.eslintrc

"rules": {
    "import/no-named-as-default": 0
}

Ответ 2

Столкнулся с этой проблемой, потому что я использую React + Redux:

export class ButtonBack extends React.Component {
  // code removed
}
export default connect(null, null)(ButtonBack);

Так что с кодом выше это даст мне предупреждение:

import ButtonBack from ./ButtonBack;

переход к следующему устраняет проблему:

import ConnectedButtonBack from ./ButtonBack;

Не экспортирование class ButtonBack также class ButtonBack бы проблему, но я хотел бы экспортировать его, чтобы помочь с тестированием.

Источник: http://redux.js.org/docs/recipes/WritingTests.html#connected-components

Редактировать:

Мое предпочтительное решение этой проблемы - иметь отдельные файлы для компонентов и контейнера. Я думаю, что это делает файлы меньше и легче для понимания. В этом случае у меня будет два файла:

components/ButtonBack.js
containers/ButtonBackContainer.js

Ответ 3

Исходная проблемная строка:

import ButtonBack from '../ButtonBack'; 

Фиксированная линия:

import { ButtonBack } from '../ButtonBack'; 

Ответ 4

Это довольно глупо для esLint, но я решил разрешить это, чтобы проверить экспортируемый файл, у меня случайно был класс экспорта, а затем экспорт по умолчанию. По-прежнему была ошибка lint, повторная запись строки импорта в родительском и eslint очищенном предупреждении.

Ответ 5

Вы также можете использовать псевдоним при экспорте и противоположный псевдоним при импорте

Ответ 6

У меня была такая же проблема, когда я импортировал компоненты класса, и это было таким простым решением.

Решение

Просто добавь

"parser": "babel-eslint"

в ваш конфигурационный файл eslintrc после того, как вы установили этот пакет с

npm install babel-eslint --save-dev

или же

yarn add babel-eslint --dev

объяснение

babel-eslint говорит eslint использовать конфигурацию, указанную в моем файле конфигурации Babel. Там я указал, что использую React и поэтому eslint больше не будет жаловаться. Вот так выглядит мой файл конфигурации Babel:

{
  "presets": [
    "@babel/preset-env",
    "@babel/preset-react"
  ],
  "plugins": ["@babel/plugin-proposal-class-properties"]
}