skip to main content

Node.js — дом инструментов разработки

js

Кратко 🔗

Node.js — это платформа, которая позволяет запускать JavaScript вне браузера. Области её применения можно разделить на две категории — создание серверных веб-приложений и создание инструментов для разработки.

Вся современная разработка на JavaScript строиться вокруг огромного числа инструментов — тулинга. Большинство этих инструментов используют Node.js.

Тулинг (калька английского слова tooling) — набор инструментов для разработки.

Практически для каждого этапа работы на JS-проектом потребуется инструмент, который использует Node.js. Вот пара примеров:

  • Разработка требует установки зависимостей через менеджер зависимостей. Все популярные пакетные менеджеры написаны на JavaScript или его диалектах и используют Node.js.
  • Типичный проект требует этапа сборки кода перед отправкой его в браузер. Все популярные сборщики написаны на JavaScript или его диалектах и используют Node.js.
  • Абсолютное большенство проектов используют статический анализ для контроля качества кода. Все популярные статические анализаторы написаны на JavaScript или его диалектах и используют Node.js.

Это означает, что даже разработчикам интерфейсов важно понимать как работает Node.js и уметь минимально с ней взаимодействовать.

Как понять 🔗

Обычно мы не запускаем инструменты напрямую с помощью Node.js, а используем для этого пакетный менеджер. Команды, которые используются в проекте нужно определить в разделе scripts файла package.json:

// package.json
{
// ...
"scripts": {
"lint": "eslint \"./src/**/*.js\""
}
// ...
}

Запускается такой скрипт очень просто:

npm run lint

Но это просто удобная форма запуска команды:

node ./node_modules/.bin/eslint "./src/**/*.js"

В этой строке происходит сразу несколько вещей: с помощью Node.js мы запускаем файл eslint, который лежит в папке node_modules/.bin, и передаём ему как аргумент строку, по которой ESLint найдёт файлы для анализа.

Файл eslint — это программа, написанная на JavaScript. В ней не происходит никакой магии.

В таком скрипте много кода, но для понимания принципа работы Node.js-инструментов можно его упростить и посмотреть на принципиальную схему:

// Это не настоящий ESLint, а просто пример того
// как может быть устроен скрипт на Node.js

// Получаем аргументы командной строки,
// чтобы найти файлы которые следует анализировать
const cliOptions = parseCommandLineArguments(process.args)

// Читаем файл конфигурации,
// чтобы решить какие правила анализа нужно применить
const configOptions = parseConfigFile(".eslintrs")

// Собираем финальную конфигурацию
const options = mergeConfigs([cliOptions, configOptions])

// Находим все файлы, удовлетворящие условию
const files = findFiles(options)

// Ищем нарушения правил в каждом файле
// и пишем о них в консоль
const errors = analyzeFiles(files, options)
for (const error of errors) {
console.warn(error)
}

// Если была найдена хоть одна ошибка, завершаем выполнение с кодом 1
// если ошибок не было, завершаем выполнение с кодом 0
if (errors.length > 0) {
process.exit(1)
} else {
process.exit(0)
}

Любая консольная программа при завершении может сообщить операционной системе код результата. Принято возвращать 0 при успешном завершении и 1 при ошибке.

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

В работе 🔗

Версия Node.js 🔗

Node.js очень динамично развивается, новые версии выходят каждые пару месяцев, но не стоит спешить переводить свои проекты на них. Каждые два года выходит LTS-версия платформы, которая характеризуется стабильностью, поддержкой, постоянными исправлениями багов и уязвимостей.

LTS (long-term support) — долгосрочная поддержка, обещание разработчиков поддерживать версию программы дольше, чем другие версии.

Традиционно, LTS-статус получают только четные версии Node.js. Их и следует использовать при разработке.

❌ Node.js 11 не будет поддерживаться, может быть нестабильной, не стоит ее использовать.

✅ Node.js 14 будет поддерживаться разработчиками несколько лет, они будут исправлять баги и закрывать уязвимости, можно брать.

Нативные зависимости 🔗

Не любую программу есть смысл писать на JavaScript. Например, sharp (пакет для обработки изображений) использует libvips — библиотеку написанную на C. У такого подхода есть два преимущества:

  1. Можно использовать уже написанный, проверенный код на другом языке (например, C), не переписывать его на JavaScript;
  2. JavaScript — не самый быстрый язык и часто решение на более низкоуровневом языке будет работать сильно быстрее.

Обратная сторона такого подхода — не самая удобная работа с такими зависимостями. Если JavaScript работает гарантированно в любом окружении, которое поддерживает Node.js, то библиотеки написанные на других языках может быть сложно собрать для какой-то конкретной операционной системы, могут возникать проблемы с совместимостью, требоваться установка разных сторонних программ.