В Node.js существует два основных способа установки пакетов: глобальный и локальный. Эти подходы определяют, где именно располагается библиотека, как она подключается к проекту и каким образом управляется её версия.
Глобальная установка размещает пакет в системном окружении Node.js,
делая его доступным как CLI-инструмент во всех директориях. Локальная
установка привязывает пакет к конкретному проекту и сохраняет его в
node_modules, обеспечивая изолированность зависимостей.
Для ESLint, как инструмента статического анализа кода JavaScript, выбор способа установки напрямую влияет на воспроизводимость сборки, поведение линтера и интеграцию с инструментами разработки.
Глобальная установка выполняется через менеджер пакетов и размещает ESLint в общем пространстве окружения:
npm install -g eslint
После установки бинарный файл eslint становится доступен
как системная команда. Это позволяет запускать линтер вне контекста
конкретного проекта:
eslint file.js
Глобальный вариант создаёт единый экземпляр ESLint для всей системы. Это приводит к нескольким характерным особенностям:
package.json конкретного
проекта;Такой подход исторически применялся для упрощения использования CLI-инструментов, однако в современных JavaScript-проектах он считается менее предпочтительным.
Использование глобального ESLint создаёт ряд системных проблем:
Особенно критичной становится ситуация, когда проект использует плагины ESLint, установленные локально, а сам линтер — глобально. В этом случае возникает несоответствие зависимостей и окружений.
Локальная установка выполняется внутри проекта:
npm install --save-dev eslint
ESLint сохраняется в devDependencies и становится частью
структуры проекта. Запуск осуществляется через локальный бинарный
файл:
npx eslint file.js
или через npm-скрипты:
{
"scripts": {
"lint": "eslint ."
}
}
Локальный вариант обеспечивает строгую привязку к проекту:
package.json;Node.js разрешает локальные бинарные файлы через
node_modules/.bin, что делает запуск ESLint прозрачным в
рамках проекта.
При локальной установке Node.js использует алгоритм разрешения модулей, начиная поиск в текущей директории:
project/
├─ node_modules/
│ ├─ eslint/
│ └─ .bin/eslint
├─ package.json
При вызове через npx или npm-скрипт система
автоматически обращается к локальной версии.
Глобальная установка, напротив, опирается на системные пути:
/usr/local/lib/node_modules%AppData%\npm\node_modulesЭто создаёт разделение контекстов между проектами и системой.
ESLint активно использует плагины и парсеры, которые тесно связаны с его версией. Например:
eslint-plugin-react@typescript-eslint/parsereslint-plugin-importПри глобальной установке возможна ситуация, когда:
Это приводит к ошибкам вида:
Error: Failed to load plugin
Локальная установка устраняет этот класс проблем, поскольку все
зависимости фиксируются в одном дереве node_modules.
Инструмент npx выполняет запуск локально установленного
пакета без необходимости ручного указания пути:
npx eslint .
Поведение npx:
node_modules/.bin;Это делает глобальную установку ESLint практически ненужной для повседневной разработки.
Локальная установка ESLint фиксирует версию в зависимостях:
{
"devDependencies": {
"eslint": "^8.57.0"
}
}
Символ ^ допускает обновления минорных версий, но
сохраняет совместимость API в рамках major-версии.
Фиксация версии обеспечивает:
В автоматизированных пайплайнах критично, чтобы ESLint работал одинаково везде. Локальная установка позволяет:
npm ci;Глобальная установка в CI приводит к риску расхождения результатов линтинга между локальной средой и сервером сборки.
В монорепозиториях ESLint устанавливается локально на уровне корня:
repo/
├─ packages/
├─ package.json
├─ node_modules/
Все пакеты используют одну версию ESLint через hoisting (npm, yarn, pnpm). Это обеспечивает:
Глобальная установка в монорепозиториях не используется, поскольку не способна обеспечить согласованность между пакетами.
При глобальной установке команда eslint доступна
благодаря добавлению в системный PATH.
При локальной установке доступ осуществляется через:
npx eslint./node_modules/.bin/eslintРазница проявляется в том, что локальная версия всегда соответствует версии проекта, тогда как глобальная может быть иной.
Современная экосистема JavaScript ориентирована на воспроизводимость и изоляцию зависимостей. Локальная установка ESLint соответствует этим принципам:
Глобальная установка сохраняет значение только для вспомогательных сценариев, связанных с быстрым тестированием или одноразовыми проверками вне проекта, однако в регулярной разработке она не используется как основной механизм.