Не удается получить правильный автоформат при сохранении в коде 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 итераций.

См. Эти ссылки для получения дополнительной информации:

Я создал минимальную настройку, чтобы продемонстрировать эту проблему:

Ответ 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
    }
  ]

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