Невозможно отключить выражения eslint no-unused-expression - PullRequest
0 голосов
/ 01 января 2019

Я создал приложение с помощью create-реагировать на приложение и применил правила airbnb.Приложение также содержит избыточность и поток.

Следующий код выдает ошибку no-unused-expression в eslint:

const reducer = (state: string = '', action: Action) => {
    switch (action.type) {
        // cases
        default:
            (action: empty); // this is throwing eslint/no-unused-expressions
            return state;
    }
};

Я пытаюсь отключить правило в eslintrc, чтобычтобы заменить его на flowtype / no-unused-expressionions

содержимое моего .eslintrc.yml

extends:
    - airbnb
parser: babel-eslint
env:
    browser: true
    jest: true
globals:
    SyntheticEvent: true,
rules:
    no-unused-expressions: off
    react/prefer-stateless-function: off
    react/jsx-filename-extension: off
    react/jsx-one-expression-per-line: off

При этих настройках ошибка no-unused-expressionions больше не отображается вредактор (vscode).Однако, как только я скомпилирую с npm run start, ошибка все еще будет:

Expected an assignment or function call and instead saw an expression  no-unused-expressions

, что приведет к сбою при компиляции.

Конечно, если я отключу локально eslint для этого правила, напримерс

// eslint-disable-line no-unused-expressions

Все работает как в редакторе, так и в браузере.Однако, как я уже сказал, я пытаюсь заменить правило eslint на тип потока точно так, чтобы избежать необходимости отключать eslint каждый раз, когда я использую утверждение типа потока.

Есть идеи, что я делаю неправильно?

package.json content:

{
  "name": "would-you-rather",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "eslint-config-airbnb": "17.1.0",
    "eslint-config-flowtype-essential": "^1.0.0",
    "eslint-plugin-flowtype": "^3.2.0",
    "flow-bin": "0.89.0",
    "flow-typed": "2.5.1",
    "immutable": "4.0.0-rc.12",
    "prop-types": "15.6.2",
    "react": "16.6.3",
    "react-dom": "16.6.3",
    "react-icons": "3.2.2",
    "react-redux": "6.0.0",
    "react-redux-loading-bar": "4.1.0",
    "react-router-dom": "4.3.1",
    "react-scripts": "2.1.1",
    "redux": "4.0.1",
    "redux-immutable": "4.0.0",
    "redux-thunk": "2.3.0", 
    "semantic-ui-css": "2.4.1",
    "semantic-ui-react": "0.84.0"
  },
  "devDependencies": {
    "docdash": "1.0.1",
    "jsdoc": "3.5.5"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject",
    "jsdoc": "jsdoc --configure jsdoc.conf.json --recurse --private",
    "flow": "$(npm bin)/flow",
    "flow-typed": "$(npm bin)/flow-typed",
    "postinstall": "$(npm bin)/flow-typed install"
  },
  "browserslist": [
    ">0.2%",
    "not dead",
    "not ie <= 11",
    "not op_mini all"
  ]
}

Ссылка проекта на github , если вы хотите поиграть с ним

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Как отметил Джесси в своем ответе , похоже, что игнорирование .eslintrc - это то, что сделано намеренно сценариями реагирования.Я смог достичь своей цели, извлекая и удаляя раздел eslintConfig, добавленный сценарием отклонения в package.json. Однако я чувствую, что было бы лучше отключить встроенный eslint и избежать извлечения

0 голосов
/ 04 января 2019

Скрипты, включенные в реагирующие скрипты, специально не читают переопределения из файлов eslintrc.Аргументация объясняется в комментарии к проблеме :

Я не думаю, что это будет хорошим решением.Мы настойчиво показываем нарушения lint (в браузере для ошибок, в консоли для предупреждений), и поэтому мы не включили никаких правил стилей в конфигурацию.

Я думаю, что правила стилей должны обрабатываться полностью отдельно, прежде чем вы подтвердите,Они не должны отвлекать вас во время разработки или быть громкими в браузере или терминале.

Я думаю, что идея заключается в том, что вы можете использовать свою собственную конфигурацию eslint для добавления правил стиля, специфичных для вашего проекта, которые выпроверка в процессе разработки;но build и start не будут на это смотреть, и вместо этого будут придерживаться консервативного набора правил, связанного с реагирующими скриптами.Тот факт, что вы обнаружили случай, когда эти консервативные правила мешают вашему рабочему процессу, вероятно, заслуживает отчета о проблеме с помощью create-реагировать-приложения.

Я думаю, что самым простым решением является использование строки // eslint-disable-line no-unused-expressions, так какты упомянул.Но есть пара других вариантов.Вы можете изменить выражение, чтобы убедить eslint в том, что оно не используется, или вы можете использовать инструмент, такой как patch-package , чтобы изменить конфигурацию веб-пакета response-scripts так, чтобы он считывал вашу пользовательскую конфигурацию eslint.

Убедите eslint в том, что используется выражение

Конфигурация eslint, используемая программой-сценариями, находится в node_modules/eslint-config-react-app/index.js.Вы можете видеть, что он устанавливает некоторые исключения из правила no-unused-expression выражений:

'no-unused-expressions': [
  'error',
  {
    allowShortCircuit: true,
    allowTernary: true,
    allowTaggedTemplates: true,
  },
],

Допускаются троичные выражения.Вы можете комбинировать утверждение типа с вызовом функции (который никогда не должен запускаться, потому что action всегда должен быть правдивым):

(action: empty) || noop();

Патч-конфигурация скриптов реакции Webpack

Вы можете увидетькод, который использует реагирующие сценарии для запуска eslint в node_modules/react-scripts/config/webpack.config.dev.js и снова в node_modules/react-scripts/config/webpack.config.dev.js:

// First, run the linter.
// It's important to do this before Babel processes the JS.
{
  test: /\.(js|mjs|jsx)$/,
  enforce: 'pre',
  use: [
    {
      options: {
        formatter: require.resolve('react-dev-utils/eslintFormatter'),
        eslintPath: require.resolve('eslint'),
        // @remove-on-eject-begin
        baseConfig: {
          extends: [require.resolve('eslint-config-react-app')],
          settings: { react: { version: '999.999.999' } },
        },
        ignore: false,
        useEslintrc: false,
        // @remove-on-eject-end
      },
      loader: require.resolve('eslint-loader'),
    },
  ],
  include: paths.appSrc,
},

Чтобы использовать пользовательскую конфигурацию, необходимо изменить строку useEslintrc: false на useEslintrc: true в обоихфайлы.Затем используйте patch-package для автоматического повторного применения этого изменения при установке или обновлении response-scripts.Добавьте этот сценарий в раздел сценариев в package.json:

"scripts": {
  "prepare": "patch-package"
}

Установите пакет исправлений и подготовьте postinstall, чтобы убедиться, что пряжа запускает сценарий prepare:

$ yarn add --dev patch-package postinstall-prepare

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

$ yarn patch-package react-scripts

Тосоздаст файл с именем вроде patches/react-scripts+2.1.1.patch.Вы должны проверить этот файл в системе контроля версий.

...