Не удается получить правильный автоформат при сохранении в коде Visual Studio с помощью ESLint и Prettier
в Visual Studio Code с ESLint и Prettier при работе с файлами.vue кажется, что я не могу правильно получить правильные настройки vue/max-attributes-per-line.
Например, если vue/max-attributes-per-line настроено на "off", и я пытаюсь добавить разрывы строк вручную, он исправляет его, чтобы каждый элемент имел не более одной строки, независимо от того, является ли оно 81, 120, 200 или более символов. Как я могу выяснить, что заставляет мои элементы разметки на одну строку?
Я использую ESLint версии 5.1.0 и Visual Studio Code (без более подробного расширения) с Prettier 1.14.2.
Вот пример в.vue file--, я не могу сделать это на нескольких строках независимо от того, что я делаю, когда 'vue/max-attributes-per-line': 'off'
. Каждый раз, когда я сохраняю, он заставляет длинную линию разметки быть на одной линии.
<template>
<font-awesome-icon v-if="statusOptions.icon" :icon="statusOptions.icon" :spin="statusOptions.isIconSpin" :class="['saving-indicator', 'pl-1', 'pt-1', statusOptions.iconClasses]" />
</template>
Если я устанавливаю 'vue/max-attributes-per-line': 2
, он форматируется так же, с одним прерыванием строки (что тоже неправильно).
<font-awesome-icon v-if="statusOptions.icon"
:icon="statusOptions.icon" :spin="statusOptions.isIconSpin" :class="['saving-indicator', 'pl-1', 'pt-1', statusOptions.iconClasses]" />
Если я попытаюсь переформатировать его вручную, он просто вернется к приведенному выше, когда я сохраню.
Кроме того, кажется, что он дважды переформатирован, когда я нажимаю Ctrl + S: сначала он переформатирует, чтобы поместить все это на одну строку, а затем через полсекунды форматирование выше результатов. Любые идеи? Что вызывает эту странность - есть ли несколько реформаторов? Как я могу определить, что первый отключить?
Параметры рабочей области VS Code:
{
"editor.formatOnType": false,
"editor.formatOnPaste": false,
"editor.formatOnSave": true,
"[javascript]": {
"editor.tabSize": 2
},
"[vue]": {
"editor.tabSize": 2
},
"[csharp]": {
"editor.tabSize": 4
},
"javascript.format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": true,
"javascript.referencesCodeLens.enabled": true,
"vetur.validation.script": false,
"vetur.validation.template": false,
"eslint.autoFixOnSave": true,
"eslint.alwaysShowStatus": true,
"eslint.options": {
"extensions": [
".html",
".js",
".vue",
".jsx"
]
},
"eslint.validate": [
{
"language": "html",
"autoFix": true
},
{
"language": "vue",
"autoFix": true
},
"vue-html",
{
"language": "javascript",
"autoFix": true
},
{
"language": "javascriptreact",
"autoFix": true
}
],
"editor.rulers": [
80,
100
]
}
.eslintrc.js:
module.exports = {
parserOptions: {
parser: 'babel-eslint'
},
env: {
browser: true,
node: true,
jest: true
},
globals: {
expect: true
},
extends: [
'prettier',
'plugin:vue/recommended', // /base, /essential, /strongly-recommended, /recommended
'plugin:prettier/recommended', // turns off all ESLINT rules that are unnecessary due to Prettier or might conflict with Prettier.
'eslint:recommended'
],
plugins: ['vue', 'prettier'],
rules: {
'vue/max-attributes-per-line': 'off',
'prettier/prettier': [ // customizing prettier rules (not many of them are customizable)
'error',
{
singleQuote: true,
semi: false,
tabWidth: 2
},
],
'no-console': 'off'
}
}
Без изменения каких-либо настроек ESLint --fix
действительно форматируется должным образом - правильное разбиение всех элементов шаблона.vue на многие строки. Итак, любые идеи о том, как я вставляю VS Code в форму? Вышеуказанные настройки не помогли, но я не понимаю, как узнать, что мешает. Есть идеи?
Чтобы подчеркнуть, когда я сохраняю в VS Code, длинный элемент HTML будет сжиматься до одной строки, а затем переходить на две строки через полсекунды позже, все из одной операции сохранения. Я ожидаю, чтобы он разложил его на многие строки. Было бы хорошо, если бы потребовалось несколько сейвов, но вместо этого первое сохранение отображает это поведение, а также каждое последующее сохранение.
Ответы
Ответ 1
Краткий ответ: мне нужно: "editor.formatOnSave": false, "javascript.format.enable": false
.
Я наконец-то нашел волшебную комбинацию настроек благодаря этой теме от Wes Bos в Twitter. Я был прав в своем подозрении, что, кажется, есть несколько конфликтующих форматеров. Хотя я не уверен, что они на самом деле, я смог отключить все, кроме eslint следующим образом:
В настройках VS Code мне нужно:
"editor.formatOnSave": false,
"javascript.format.enable": false,
"eslint.autoFixOnSave": true,
"eslint.alwaysShowStatus": true,
"eslint.options": {
"extensions": [ ".html", ".js", ".vue", ".jsx" ]
},
"eslint.validate": [
{ "language": "html", "autoFix": true },
{ "language": "vue", "autoFix": true },
{ "language": "javascript", "autoFix": true },
{ "language": "javascriptreact", "autoFix": true }
]
В .eslintrc.js я могу использовать настройки в своем исходном сообщении, а также изменить "vue/max-attribute-per-line" по своему усмотрению. Затем плагин VS Code ESLint будет форматировать код по одному при каждом сохранении, как писал кендзиру. Последнее замечание: HMR не воспримет эти изменения, так что перестраивайте с нуля.
Ответ 2
С 'vue/max-attributes-per-line': 'off'
правило отключено, поэтому VSCode не пытается исправить длинную строку при автосохранении. Другие исправления eslint применяются, как и ожидалось.
С помощью 'vue/max-attributes-per-line': 1
VSCode исправляет только одну ошибку при сохранении. Это известное ограничение vscode-eslint
vscode-eslint выполняет только один проход, чтобы свести к минимуму количество изменений, созданных плагином. Цель состоит в том, чтобы сохранить как можно больше маркеров (например, точек останова) в файле.
VSCode имеет ограничение на 1 секунду для всех плагинов для вычисления набора изменений при сохранении. Если один из плагинов заставляет другие плагины не запускаться 3 раза подряд, он будет отключен.
eslint --fix
запускает все правила в цикле до тех пор, пока не будет больше ошибок при переливании. Я думаю, что он имеет максимум 10 итераций.
См. Эти ссылки для получения дополнительной информации:
Я создал минимальную настройку, чтобы продемонстрировать эту проблему:
Ответ 3
Эта статья помогла мне заставить Vetur + ESLint + Prettier работать вместе и заставить мой autoFixOnSave работать: https://medium.com/@doppelmutzi/eslint-prettier-vue-workflow-46a3cf54332f
Ответ 4
Я боролся с подобной проблемой. Я пробовал решение выше, но, к сожалению, у меня не получилось. Я использую eslint и Vetur, не установил более симпатичный плагин, но настроил его через eslint и включил "eslint.autoFixOnSave": true. Я наконец получил правильный автоформат при сохранении, удалив следующую конфигурацию в settings.json. Не уверен, почему, но это работает для меня.
"eslint.options": {
"extensions": [".html", ".js", ".vue", ".jsx"]
},
"eslint.validate": [{
"language": "html",
"autoFix": true
},
{
"language": "vue",
"autoFix": true
},
{
"language": "javascript",
"autoFix": true
},
{
"language": "javascriptreact",
"autoFix": true
}
]
Обновлю этот ответ, если я получу другие вопросы, связанные с этим.