← Назад к вопросам

Какие внешние зависимости есть у Node.js помимо V8 и libuv?

3.0 Senior🔥 51 комментариев
#Node.js и JavaScript

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Какие внешние зависимости есть у Node.js помимо V8 и libuv?

Node.js — это комплексное приложение, зависящее от множества C/C++ библиотек для криптографии, сетей, сжатия и других функций.

OpenSSL — криптография и безопасность

Назначение: Криптографические операции, HTTPS, SSL/TLS

const crypto = require('crypto');
const https = require('https');

// HTTPS сервер работает благодаря OpenSSL
const server = https.createServer({ key, cert }, (req, res) => {
  res.end('Secure');
});

// Криптографические функции
const hash = crypto.createHash('sha256');
hash.update('data');
console.log(hash.digest('hex'));

zlib — сжатие данных

Назначение: Сжатие и распаковка (gzip, deflate, brotli)

const zlib = require('zlib');
const fs = require('fs');

// Сжатие файла
fs.createReadStream('file.txt')
  .pipe(zlib.createGzip())
  .pipe(fs.createWriteStream('file.txt.gz'));

// Распаковка
fs.createReadStream('file.txt.gz')
  .pipe(zlib.createGunzip())
  .pipe(process.stdout);

c-ares — DNS резолюция

Назначение: Асинхронная DNS резолюция

const dns = require('dns');

// Работает благодаря c-ares
dns.resolve4('example.com', (err, addresses) => {
  if (err) throw err;
  console.log(addresses); // ['93.184.216.34']
});

// Обратная резолюция
dns.reverse('93.184.216.34', (err, hostnames) => {
  console.log(hostnames);
});

http-parser (llhttp) — парсинг HTTP

Назначение: Парсинг HTTP запросов и ответов

const http = require('http');

const server = http.createServer((req, res) => {
  // http-parser распарсил заголовки и URL
  console.log(req.method);     // GET, POST
  console.log(req.url);        // /path?query=value
  console.log(req.headers);    // { host: '...', ... }
  res.end('OK');
});

nghttp2 — HTTP/2

Назначение: Поддержка HTTP/2 протокола

const http2 = require('http2');

// HTTP/2 работает благодаря nghttp2
const server = http2.createSecureServer({
  key: fs.readFileSync('key.pem'),
  cert: fs.readFileSync('cert.pem')
}, (req, res) => {
  res.end('HTTP/2');
});

server.listen(443);

brotli — современное сжатие

Назначение: Более эффективное сжатие чем gzip

const zlib = require('zlib');

// Brotli сжатие
zlib.brotliCompress('Large data', (err, compressed) => {
  if (err) throw err;
  console.log(compressed);
});

ICU — интернационализация

Назначение: Unicode, локализация, форматирование дат

// Зависит от ICU
const str = 'café';
console.log(str.localeCompare('cafe')); // Разные символы

// Локализация дат и времени
const date = new Date();
console.log(date.toLocaleString('ru-RU')); // Русский формат

napi — Native API

Назначение: API для создания native модулей на C++

// Позволяет писать быстрый код на C++
// который вызывается из JavaScript

Узнать все версии зависимостей

# Все версии
node -e "console.log(process.versions)"

# Вывод включает:
# node, v8, uv, zlib, brotli, openssl,
# ares, llhttp, nghttp2, ngtcp2, icu, etc.

Версионирование OpenSSL

# Узнать версию OpenSSL
node -e "console.log(process.versions.openssl)"
# v3.0.0

# OpenSSL версия КРИТИЧНА для безопасности
# Node.js обновляется при выходе патчей

Почему это важно

1. Security

  • OpenSSL обновляется при найденных уязвимостях
  • Node.js должен получить и распространить патчи

2. Performance

  • C/C++ зависимости оптимизированы для скорости
  • Криптография, сжатие — всё на нативном коде

3. Compatibility

  • Разные версии OpenSSL несовместимы
  • Native модули привязаны к версии Node.js

4. Deployment

  • При развертывании нужны правильные версии библиотек
  • Docker образы используют правильные комбинации

Проблемы в продакшене

# Ошибка: OpenSSL версия несовместима
# Error: OPENSSL_1_1_0g not found

# Решение: обновить OpenSSL в системе
apt-get install libssl-dev  # Debian/Ubuntu
brew install openssl        # macOS

# Или использовать Docker
FROM node:20-alpine  # Всё предкомпилировано

Docker рекомендация

FROM node:20-alpine
# Alpine образ имеет все необходимые зависимости
# правильные версии OpenSSL, zlib и всё остальное

Итог

Главные зависимости Node.js:

  • OpenSSL — криптография
  • zlib/brotli — сжатие
  • c-ares — DNS
  • http-parser (llhttp) — парсинг HTTP
  • nghttp2 — HTTP/2
  • ICU — интернационализация
  • libuv — асинхронный I/O
  • V8 — JavaScript движок

Все скомпилированы в бинарный файл Node.js для производительности и надёжности.

Какие внешние зависимости есть у Node.js помимо V8 и libuv? | PrepBro