Форматы конфигурации: .eslintrc.js, .eslintrc.json, .eslintrc.yml

ESLint поддерживает несколько способов описания конфигурации линтера, каждый из которых ориентирован на разные сценарии разработки и уровни гибкости. Основные форматы — JavaScript, JSON и YAML. Несмотря на различия в синтаксисе, все они описывают один и тот же набор сущностей: правила анализа кода, окружения, парсер, плагины и параметры интерпретации.


Общая структура конфигурации

Независимо от формата, конфигурация ESLint обычно включает следующие ключевые поля:

  • env — предустановленные среды выполнения
  • extends — базовые конфигурации
  • parser — используемый парсер
  • parserOptions — настройки разбора кода
  • plugins — подключаемые плагины
  • rules — набор правил
  • overrides — переопределения для отдельных файлов
  • root — остановка поиска конфигурации вверх по дереву директорий

Эти поля интерпретируются ESLint одинаково во всех форматах.


Формат .eslintrc.js

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

Базовая структура

module.exports = {
  env: {
    browser: true,
    node: true,
  },
  extends: ["eslint:recommended"],
  parserOptions: {
    ecmaVersion: 2022,
    sourceType: "module",
  },
  rules: {
    semi: ["error", "always"],
    quotes: ["error", "single"],
  },
};

Особенности JavaScript-конфига

1. Динамическая логика

const isProduction = process.env.NODE_ENV === "production";

module.exports = {
  rules: {
    "no-console": isProduction ? "error" : "warn",
  },
};

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

2. Импорт модулей

const base = require("./base.eslintrc");

module.exports = {
  ...base,
  rules: {
    ...base.rules,
    "no-debugger": "error",
  },
};

Поддержка модульной композиции позволяет строить иерархии конфигураций.

3. Использование функций

module.exports = function () {
  return {
    rules: {
      "no-unused-vars": "warn",
    },
  };
};

Функциональный подход применяется для генерации конфигураций на основе внешних параметров.


Формат .eslintrc.json

JSON-конфигурация является строго статической и наиболее ограниченной по возможностям. Она используется там, где важна простота и универсальность.

Базовый пример

{
  "env": {
    "browser": true,
    "node": true
  },
  "extends": "eslint:recommended",
  "parserOptions": {
    "ecmaVersion": 2022,
    "sourceType": "module"
  },
  "rules": {
    "semi": ["error", "always"],
    "quotes": ["error", "single"]
  }
}

Ограничения JSON-формата

  • отсутствие комментариев
  • невозможность использовать переменные
  • отсутствие логики и условий
  • невозможность динамического импорта

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

Особенность расширений

JSON допускает как строку, так и массив:

{
  "extends": ["eslint:recommended", "plugin:react/recommended"]
}

Формат .eslintrc.yml

YAML-конфигурация занимает промежуточное положение между JSON и JavaScript. Она более читаема, чем JSON, и допускает комментарии, но не поддерживает динамическую логику.

Базовая структура

env:
  browser: true
  node: true

extends:
  - eslint:recommended

parserOptions:
  ecmaVersion: 2022
  sourceType: module

rules:
  semi:
    - error
    - always
  quotes:
    - error
    - single

Преимущества YAML

1. Читаемость

Отсутствие скобок делает конфигурацию более визуально чистой, особенно при больших объёмах правил.

2. Поддержка комментариев

# Включение браузерного окружения
env:
  browser: true

Комментарии позволяют документировать конфигурацию прямо в файле.

3. Структурированность

Вложенные объекты читаются естественно без синтаксического шума.


Сравнение форматов конфигурации

Гибкость

  • JavaScript — максимальная
  • YAML — средняя
  • JSON — минимальная

Читаемость

  • YAML — высокая
  • JSON — средняя
  • JavaScript — зависит от стиля

Поддержка логики

  • JavaScript — полная
  • YAML — отсутствует
  • JSON — отсутствует

Поведение при объединении конфигураций

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

Приоритеты:

  1. Локальная конфигурация ближе к файлу
  2. overrides внутри конфигурации
  3. базовые конфигурации через extends
  4. конфигурации из родительских директорий (если root не установлен)

Поле extends и его влияние

extends позволяет наследовать набор правил из:

  • встроенных пресетов (eslint:recommended)
  • плагинов (plugin:react/recommended)
  • внешних конфигураций (airbnb, standard)
  • локальных файлов

Пример:

extends: [
  "eslint:recommended",
  "plugin:@typescript-eslint/recommended"
]

Конфигурация строится каскадно: каждое последующее расширение переопределяет предыдущие значения.


Overrides и файловые контексты

overrides позволяет применять разные правила для различных типов файлов.

Пример:

module.exports = {
  rules: {
    "no-console": "warn",
  },
  overrides: [
    {
      files: ["*.test.js"],
      rules: {
        "no-console": "off",
      },
    },
  ],
};

Это особенно важно для разделения production-кода и тестов.


parserOptions в разных форматах

Независимо от формата, parserOptions задаёт параметры интерпретации ECMAScript:

  • версия стандарта
  • тип модулей
  • JSX поддержка
  • дополнительные параметры парсера

Пример:

"parserOptions": {
  "ecmaVersion": "latest",
  "sourceType": "module",
  "ecmaFeatures": {
    "jsx": true
  }
}

rules как основа конфигурации

Поле rules определяет поведение линтера на уровне синтаксиса и стиля.

Каждое правило имеет формат:

"имя-правила": [уровень, параметры]

Уровни:

  • "off" или 0
  • "warn" или 1
  • "error" или 2

Пример:

rules: {
  "no-unused-vars": "error",
  "eqeqeq": ["error", "always"],
}

Особенности выбора формата в реальных проектах

JavaScript-конфигурация применяется в системах с:

  • монорепозиториями
  • разными окружениями (dev/prod/test)
  • необходимостью вычисляемых правил

JSON используется в:

  • статичных проектах
  • библиотечных шаблонах
  • средах с ограничениями на выполнение JS

YAML встречается:

  • в больших командах
  • в проектах с акцентом на читаемость
  • при ручном редактировании конфигураций

Синтаксические нюансы и ошибки

JSON

  • запрещены trailing commas
  • обязательны двойные кавычки
  • нельзя вставлять комментарии

YAML

  • чувствителен к отступам
  • возможна неоднозначная интерпретация типов
  • требует аккуратного форматирования

JavaScript

  • возможны runtime-ошибки
  • зависит от Node.js окружения
  • требует корректного экспорта module.exports

Расширяемость конфигураций

JavaScript-формат позволяет строить обёртки над ESLint-конфигурацией:

function createConfig({ strict }) {
  return {
    rules: {
      "no-console": strict ? "error" : "warn",
    },
  };
}

module.exports = createConfig({ strict: true });

Такой подход используется в корпоративных стандартах кодирования.


Взаимодействие форматов в одном проекте

ESLint выбирает один основной файл конфигурации, но при отсутствии root: true может подниматься вверх по директориям и комбинировать несколько источников.

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