ESLint-плагин для Node.js-окружения предназначен для статического анализа JavaScript-кода с учётом особенностей выполнения в среде Node. Он дополняет базовые правила ESLint набором проверок, ориентированных на модули CommonJS и ES Modules, встроенные API Node, управление зависимостями, совместимость версий и корректность использования файловой системы и стандартных библиотек.
Основная цель подобных правил — выявление ошибок, которые не могут быть обнаружены стандартным линтером JavaScript, но приводят к падениям приложения, утечкам зависимостей, несовместимости с версией Node или некорректной сборке пакета.
Плагин эволюционировал: первоначально широко использовался пакет
eslint-plugin-node, позднее функциональность была
перенесена и продолжена в виде eslint-plugin-n, однако в
учебной и исторической практике оба названия часто встречаются как
обозначение одного класса правил.
Подключение осуществляется через npm или yarn:
npm install eslint-plugin-node --save-dev
или (в современных конфигурациях):
npm install eslint-plugin-n --save-dev
Подключение в конфигурации ESLint:
{
"plugins": ["node"]
}
или для нового варианта:
{
"plugins": ["n"]
}
Расширенная конфигурация через extends:
{
"extends": ["plugin:node/recommended"]
}
или:
{
"extends": ["plugin:n/recommended"]
}
Рекомендуемый пресет включает базовые правила, направленные на выявление наиболее частых проблем в Node.js-проектах.
Набор правил условно делится на несколько категорий:
Каждая категория ориентирована на снижение вероятности ошибок, которые проявляются только в рантайме.
Одной из ключевых задач является контроль использования встроенных модулей и глобальных объектов.
Правило:
node/no-deprecated-apiВыявляет использование функций Node.js, помеченных как устаревшие. Это критично для долгоживущих приложений, где обновление версии Node может привести к неожиданным падениям.
Пример:
const domain = require("domain");
domain.create();
Такой код может быть отмечен как небезопасный из-за устаревшего API
domain.
Правила:
node/prefer-global/buffernode/prefer-global/processnode/prefer-global/consoleЭти правила обеспечивают консистентность использования глобальных объектов.
Пример нарушения:
const Buffer = require("buffer").Buffer;
const buf = new Buffer("data");
Предпочтительный вариант:
const buf = Buffer.from("data");
Node.js поддерживает два основных подхода: CommonJS
(require) и ES Modules (import). Плагин
обеспечивает анализ корректности использования обоих механизмов.
Правила:
node/no-missing-requirenode/no-missing-importЭти проверки выявляют ситуации, когда модуль указан, но физически
отсутствует в node_modules или указан неверный путь.
Пример:
const utils = require("./utilss");
Если файла utilss.js не существует, линтер фиксирует
ошибку до выполнения кода.
Правила:
node/no-extraneous-requirenode/no-extraneous-importКонтролируют соответствие импортируемых пакетов списку зависимостей в
package.json.
Пример:
const lodash = require("lodash");
Если lodash не указан в dependencies, будет
выдано предупреждение.
Правила:
node/no-unpublished-requirenode/no-unpublished-importПроверяют использование файлов или пакетов, которые не предназначены для публикации (например, находятся в тестовых директориях).
Одной из наиболее мощных возможностей является контроль использования функций, недоступных в текущей версии Node.
Правило:
node/no-unsupported-features/es-syntaxОно анализирует использование современных конструкций JavaScript (optional chaining, nullish coalescing и другие) в контексте заданной версии Node.
Пример:
const value = obj?.data?.name;
Если целевая версия Node ниже требуемой, линтер выдаёт ошибку.
Правило:
node/no-unsupported-features/node-builtinsКонтролирует использование новых встроенных API Node.
Пример:
const { readFile } = require("fs/promises");
Если версия Node не поддерживает fs/promises, код
считается несовместимым.
Правило:
node/shebangКонтролирует корректность использования shebang-строки:
#!/usr/bin/env node
console.log("CLI tool");
Ошибки возникают при некорректной позиции или отсутствии строки в CLI-скриптах.
Правило:
node/no-unpublished-binПроверяет, что бинарные файлы, указанные в package.json,
действительно существуют и не исключены из публикации.
Некоторые правила касаются поведения процесса Node.js.
В ряде конфигураций может активироваться правило:
node/no-process-exitОно ограничивает использование:
process.exit(1);
Причина — неконтролируемое завершение процесса может нарушать работу серверов и асинхронных задач.
Правила:
node/prefer-promises/dnsnode/prefer-promises/fsОни стимулируют использование промис-версий API вместо callback-ориентированных функций.
Пример:
const fs = require("fs");
fs.readFile("file.txt", (err, data) => {
if (err) throw err;
});
Рекомендуемая форма:
const fs = require("fs/promises");
const data = await fs.readFile("file.txt");
Для корректной работы многих правил требуется указание целевой версии среды.
Пример конфигурации:
{
"settings": {
"node": {
"version": ">=18.0.0"
}
}
}
Также может использоваться автоматическое определение через
.nvmrc или engines в
package.json.
Типовой пример .eslintrc:
{
"env": {
"node": true
},
"plugins": ["node"],
"extends": ["plugin:node/recommended"],
"rules": {
"node/no-missing-require": "error",
"node/no-extraneous-require": "warn",
"node/no-deprecated-api": "error"
}
}
В более строгих конфигурациях уровень проверки повышается до
error для всех правил, связанных с совместимостью и
зависимостями.
В Express- и Fastify-проектах плагин используется для предотвращения ошибок импорта модулей и контроля версии Node, особенно при деплое в контейнеры.
Для CLI-приложений критично правило shebang, а также
контроль бинарных файлов и корректной публикации пакета.
При разработке npm-пакетов важны правила:
no-unpublished-*no-extraneous-*Они предотвращают попадание в продакшен зависимостей, используемых только в разработке.
Рекомендуемый пресет:
plugin:node/recommendedСтрогий режим может включать:
Лёгкий режим обычно оставляет только критические ошибки:
Переход от eslint-plugin-node к
eslint-plugin-n связан с расширением поддержки современных
версий Node.js и упрощением архитектуры правил. При этом концептуальная
модель осталась прежней: анализ окружения Node как специфической
платформы с отдельными ограничениями по сравнению с браузером.
Современные конфигурации ESLint всё чаще используют комбинированные наборы правил, где Node-плагин работает совместно с TypeScript-линтерами и правилами безопасности зависимостей.
Часто используется совместно с:
eslint-plugin-import — контроль импортов и модульной
структуры;eslint-plugin-security — проверка уязвимостей;@typescript-eslint/eslint-plugin — анализ
TypeScript-кода;eslint-plugin-promise — контроль асинхронной
логики.В такой связке Node-плагин отвечает за платформенную корректность, тогда как остальные инструменты покрывают архитектуру и безопасность.
Статический анализ имеет ограничения:
require с
вычисляемыми путями;settings;Несмотря на это, плагин существенно снижает количество runtime-ошибок, связанных с окружением Node.js.