en
Eslint. Как правильно настроить

Eslint. Как правильно настроить

Eslint поможет избежать стандартных ошибок JavaScript с помощью статического анализа кода.

Устанавливаем последнюю версию Eslint, дополнительные пакеты с конфигурациями и плагин для Prettier.

npm i -D eslint \
eslint-config-airbnb-base \
eslint-config-prettier \
eslint-plugin-prettier

Такой выбор конфигурации я использую на многих проектах, и он субъективен, вы можете добавить свои конфигурации по желанию.

Для Drupal темы конфигурационные файлы отличаются, так как мы наследуем конфигурацию Eslint конфигурацию ядра Drupal.

npm i -D eslint \
eslint-config-airbnb \
eslint-config-prettier \
eslint-plugin-import \
eslint-plugin-jsx-a11y \
eslint-plugin-prettier \
eslint-plugin-react

Игнорирование 3rd party библиотек

Разработчику не нужно проверять код 3rd party библиотек или скомпилированного кода для production. Отключение лишних проверок сэкономит ресурсы IDE.

Для настройки игнорирования можно использовать файл .eslintignore.

Пример моего файла .eslintignore:

node_modules/**
vendor/**
dist/**

Синтаксис прост и схож с синтаксисом .gitignore.

Игнорирование файлов или отдельных строк

Этого делать не рекомендуется, но иногда всё же возникает необходимость добавить маркер игнорирования определённой строки или файла в целом (полезно при рефакторинге).

Игнорирование всего JS файла:

// eslint-ignore

или

// eslint-disable

Игнорирование строки или фрагмента кода:

// eslint-disable
console.log('hi')
// eslint-enable

// eslint-disable-next-line
console.log('hi')

Игнорирование определённого правила:

// eslint-disable no-console

// eslint-disable-next-line no-console
console.log('hi')

// eslint-disable no-console
console.log('hi')
// eslint-enable no-console

Интеграция с Prettier

Для интеграции Eslint с Prettier добавляем в конфигурационный файл .eslintrc.json следующую строку:

{
  "plugins": ["prettier"]
}

Примеры конфигурационных файлов

Eslint для статического сайта

Конфигурационный файл, который я использую для статических сайтов:

{
  "extends": ["airbnb-base", "plugin:prettier/recommended"],
  "root": true,
  "env": {
    "browser": true,
    "es6": true,
    "node": true
  },
  "globals": {},
  "plugins": ["prettier"],
  "rules": {
    "prettier/prettier": "error",
    "consistent-return": ["off"],
    "no-underscore-dangle": ["off"],
    "max-nested-callbacks": ["warn", 3],
    "import/no-mutable-exports": ["warn"],
    "import/extensions": ["off"],
    "import/no-extraneous-dependencies": [
      "error",
      {
        "devDependencies": true
      }
    ],
    "no-plusplus": [
      "warn",
      {
        "allowForLoopAfterthoughts": true
      }
    ],
    "no-param-reassign": ["off"],
    "no-prototype-builtins": ["off"],
    "valid-jsdoc": [
      "warn",
      {
        "prefer": {
          "returns": "return",
          "property": "prop"
        },
        "requireReturn": false
      }
    ],
    "no-unused-vars": ["warn"],
    "operator-linebreak": ["error", "after", { "overrides": { "?": "ignore", ":": "ignore" } }],
    "quotes": ["error", "single"],
    "comma-dangle": [
      "error",
      {
        "arrays": "always-multiline",
        "objects": "always-multiline",
        "imports": "always-multiline",
        "exports": "always-multiline",
        "functions": "never"
      }
    ]
  }
}

Eslint для темы Drupal

Конфигурация для темы Drupal отличается от конфигурации статического сайта тем, что она наследует .eslintrc.json из Drupal core.

Конфигурационный файл из ядра Drupal мы можем расширить правилами, которые считаем нужными, или которые приняты в команде. В моём случае, я вывожу ошибку при использовании jQuery.once и добавляю несколько мелких правил, связанных с запятой в конце строки и кавычками. Список правил Eslint огромен, его можно подсмотреть в документации.

{
  "extends": ["../../../core/.eslintrc.json"],
  "globals": {
    "context": true,
    "settings": true,
    "once": true
  },
  "plugins": ["prettier"],
  "rules": {
    "prettier/prettier": "error",
    "quotes": ["error", "single"],
    "comma-dangle": [
      "error",
      {
        "arrays": "always-multiline",
        "objects": "always-multiline",
        "imports": "always-multiline",
        "exports": "always-multiline",
        "functions": "never"
      }
    ],
    "no-restricted-syntax": [
      "error",
      {
        "selector": "MemberExpression[property.name = 'once']",
        "message": "jQuery once is not allowed. Use native Drupal once implementation."
      }
    ]
  }
}

Eslint для legacy кода в Drupal

Такая конфигурация подходит для модулей, которые никто не удосужился перевести на стандарт ES6+.

Мы наследуем legacy .eslintrc.json из Drupal core, и добавляем правила, которые считаем нужными.

{
  "extends": ["../../../core/.eslintrc.legacy.json"],
  "env": {
    "es6": false
  }
}

Надеюсь, вам не придётся больше писать legacy JavaScript, потому как это занятие не из приятных.

Хорошего кода!


Ссылки:

Последнее обновление: