ESLint применяется в Node.js-проектах как слой статического анализа, контролирующий корректность кода до его выполнения. В серверной среде Node.js, где отсутствует DOM и браузерные API, а архитектура часто строится на модульности CommonJS или ES Modules, конфигурация линтера приобретает специфические особенности: набор глобальных переменных, окружение выполнения, правила импорта модулей и интеграция с тестовыми фреймворками требуют точной настройки.
ESLint анализирует код на уровне AST (Abstract Syntax Tree), формируемого парсером (по умолчанию Espree). Процесс включает:
--fix и
правило поддерживает autofix).В Node.js-проектах важно учитывать, что стандартные браузерные предположения ESLint не применимы, поэтому конфигурация должна явно отражать серверную среду.
Конфигурационный файл ESLint определяет поведение линтера.
Современный формат — eslint.config.js, однако часто
используется и классический .eslintrc.
Пример минимальной конфигурации:
module.exports = {
env: {
node: true,
es2022: true
},
parserOptions: {
ecmaVersion: 2022,
sourceType: "module"
},
extends: ["eslint:recommended"],
rules: {
semi: ["error", "always"],
quotes: ["error", "single"]
}
};
Ключевой элемент — env: { node: true }, который
активирует глобальные переменные Node.js: process,
__dirname, require, module,
Buffer.
Node.js поддерживает две системы модулей, и ESLint должен учитывать обе.
Используются конструкции:
const fs = require('fs');
module.exports = {
read: () => fs.readFileSync('file.txt', 'utf8')
};
ESLint требует корректной настройки sourceType: "script"
либо гибридного режима, если проект смешанный.
При использовании "type": "module" в
package.json применяются:
import fs from 'fs';
export function read() {
return fs.readFileSync('file.txt', 'utf8');
}
В этом случае:
sourceType: "module"Node.js предоставляет специфические глобальные объекты, которые ESLint должен распознавать:
process — информация о процессе выполненияBuffer — работа с бинарными данными__dirname, __filename — пути файловой
системы (в CommonJS)global — глобальная область видимостиПри отсутствии env.node = true ESLint будет ошибочно
считать их неопределёнными.
Для Node.js-проектов важно соответствие версии ECMAScript, поддерживаемой средой выполнения.
parserOptions: {
ecmaVersion: "latest",
sourceType: "module"
}
Использование актуальной версии ECMAScript позволяет применять:
?.)??)Правила, связанные с безопасностью и чистотой кода:
no-unused-vars — выявляет неиспользуемые
переменныеno-undef — предотвращает использование неопределённых
идентификаторовno-var — исключает устаревший varif (user) {
doSomething();
}
Контролируется правилами:
curly — обязательные фигурные скобкиeqeqeq — строгое сравнение (=== вместо
==)no-implicit-globals — предотвращение неявных глобальных
переменныхNode.js активно использует асинхронность:
async function load() {
const data = await fetchData();
return data;
}
Полезные правила:
no-async-promise-executorrequire-awaitno-return-awaitNode.js активно взаимодействует с файловой системой, поэтому ESLint часто комбинируется с плагинами:
eslint-plugin-importeslint-plugin-node (устаревающий, но встречается)eslint-plugin-nПример правил для импортов:
rules: {
"import/no-unresolved": "error",
"import/order": ["error", {
"alphabetize": { "order": "asc" }
}]
}
Это обеспечивает структурированность зависимостей и предотвращает ошибки разрешения модулей.
Node.js-проекты часто используют Jest или Mocha. ESLint должен учитывать их глобальные функции.
Для Jest:
env: {
jest: true
}
Либо через плагины:
eslint-plugin-jestЭто позволяет распознавать:
describetestexpectВ крупных Node.js-системах ESLint часто применяется в монорепозиториях. Здесь используются:
Пример:
module.exports = {
overrides: [
{
files: ["packages/api/**/*.js"],
rules: {
"no-console": "error"
}
}
]
};
Монорепозитории часто комбинируют ESLint с:
При больших Node.js-кодовых базах критично оптимизировать ESLint:
node_modules через
ignorePatterns--cacheПример:
eslint . --cache
Кеширование снижает время повторного анализа за счёт хранения результатов AST.
ESLint часто используется как часть цепочки контроля качества:
Пример конфигурации lint-staged:
{
"*.js": "eslint --fix"
}
Это позволяет проверять только изменённые файлы перед коммитом.
ESLint поддерживает три уровня:
"off" — правило отключено"warn" — предупреждение"error" — ошибка сборкиВ Node.js-проектах обычно строгая политика применяется к:
На практике используется наследование:
extends: [
"eslint:recommended",
"plugin:import/recommended",
"plugin:node/recommended"
]
Это формирует базовый слой правил, поверх которого накладываются проектные стандарты.
Node.js может работать в различных режимах:
Каждое окружение требует разных ESLint-настроек. Например, для CLI часто разрешают:
console.logprocess.exitВ serverless-среде добавляются ограничения на глобальное состояние и файловую систему.
При использовании TypeScript в Node.js добавляется парсер:
@typescript-eslint/parserИ расширенные правила:
@typescript-eslint/no-unused-vars@typescript-eslint/explicit-function-return-typeESLint в таком контексте становится не только линтером, но и частью статической типизации.
В Node.js ESLint часто закрепляет архитектурные ограничения:
Плагин:
eslint-plugin-import с
import/no-cycleпозволяет обнаруживать архитектурные нарушения на уровне зависимостей модулей.