В нашем проекте используются Prettier и ESLint. Обычно они отлично работают вместе, но мы сталкиваемся с проблемой, когда они конфликтуют. Я не знаю почему, я не могу понять, как это исправить, и я не могу отключить prettier для строки, потому что получаю ошибки.
Соответствующие части наших настроек
// .prettierrc
"printWidth": 80,
"tabWidth": 2,
"useTabs": false,
"semi": true,
"singleQuote": true,
"trailingComma": "es5",
"arrowParens": "always"
// eslintrc.js
extends: ['airbnb', 'eslint-config-prettier', 'prettier/react'],
plugins: [
'eslint-plugin-prettier',
'redux-saga',
'react',
'react-hooks',
'jsx-a11y',
],
rules: {
'prettier/prettier': ['error'],
indent: [
2,
2,
{
SwitchCase: 1,
},
],
'max-len': 0,
А вот код с добавленными комментариями, указывающими на проблемы:
const options =
children === undefined
? items.map((item) => (
// Prettier complains about the next four lines
<option key={uuidv1()} value={item}>
{item}
</option>
))
: children;
Prettier хочет, чтобы эти строки были еще двумя пробелами.
ESLint нравятся им такими, какие они есть. Я склонен согласиться с ESLint. Если я автоматически форматирую Prettier, ESLint жалуется и хочет вернуть его обратно. Я использую VSCode. Такого конфликта нигде в нашей кодовой базе не было.
Я попытался просто отключить prettier для этих строк, но опция автоматического отключения с eslint добавляет // eslint-disable-next-line prettier/prettier
, из-за чего приложение выдает ошибку Definition for rule 'prettier/prettier' was not found
. Попытка добавить // prettier-ignore
невозможна из-за JSX.
Я не понимаю, почему Prettier хочет то, что говорит ESLint. Единственный способ исправить это - полностью удалить 'prettier/prettier': ['error'],
из нашей конфигурации ESLint, что кажется неуместным.
Предложения?
Обновление 10.10.19 - благодаря предложению пользователя chazsolo я изменил форматирование функции, чтобы получить это, что не имеет проблем с линтингом:
const dropDownOptions =
children ||
items.map((item) => (
<option key={uuidv1()} value={item.value || item}>
{item.text || item}
</option>
));
Это жизнеспособный обходной путь для этой проблемы, но я оставляю этот вопрос без ответа, так как я все еще чувствую, что мой код полностью действителен и не должен вызывать этого конфликта.
Обходной путь также работает, только если я проверяю значение типа children
на ложность. У нас есть еще одно условие, когда это совпадение, и я не могу его таким же образом замкнуть. Все эти проблемы связаны с использованием .map()
.
// Can't short-circuit here
var === SOME_ENUM
? filteredItems.map((item) => (
// some JSX
))
: filteredItems.map((item) => (
// some other JSX
));
Я могу переместить условие внутри функции карты, но это приводит к проверке условия в каждом цикле.
Эта проблема возникла много, и я, вероятно, создам проблему в Prettier с такой скоростью, потому что устранение неполадок довольно раздражает.
children
иitems.map
. Я не могу проверить, сработает ли это? - person chazsolo   schedule 10.10.2019SOME_ENUM ? filteredItems.map(fn1) : filteredItems.map(fn2)
. Я знаю, что это не решает проблему, но тем не менее чем заняться :) - person chazsolo   schedule 10.10.2019