Skip to content

Node.js

Общее описание

Node.js — это кроссплатформенная среда выполнения с открытым исходным кодом, основанная на движке V8 (от Google Chrome), позволяющая выполнять JavaScript-код вне браузера. Node.js широко используется для создания веб-серверов, API, микросервисов, десктопных и мобильных приложений, а также систем реального времени благодаря своей асинхронной, неблокирующей модели ввода-вывода.

Основные особенности:

  • Асинхронность и событийная модель
  • Неблокирующий I/O
  • Кроссплатформенность (Windows, Linux, macOS)
  • Поддержка ECMAScript 6+ (ES6+)
  • Большое количество пакетов через npm (Node Package Manager)
  • Подходит для real-time приложений (чаты, уведомления и т.д.)

Версии Node.js

Node.js выпускается в двух основных ветках:

Ветка Статус Рекомендации
LTS (Long Term Support) Поддерживается до 30 месяцев Использовать в продакшене
Current (Stable) Активно обновляется Для тестирования новых возможностей

Текущие актуальные версии (на момент написания):

  • 20.x (Harmony) — текущая стабильная версия
  • 18.x (Hydrogen) — LTS (рекомендуемая)

Рекомендуется использовать LTS-версию для production окружений.


Установка Node.js

На Ubuntu/Debian:

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs

Проверка:

node -v
npm -v

На CentOS/RHEL:

curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash -
sudo yum install -y nodejs

или через NVM:

nvm install --lts

На Windows:

Скачать установщик с https://nodejs.org
Убедитесь, что node и npm добавлены в переменную среды PATH.

Проверка:

node -v
npm -v

На macOS через Homebrew:

brew install node

Менеджеры версий Node.js

1. NVM (Node Version Manager)

Позволяет устанавливать и переключать несколько версий Node.js на одной системе.

Установка (Linux/macOS):

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

Перезагрузите терминал или выполните:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

Пример использования:

nvm install 18    # LTS
nvm install 20    # Current
nvm use 18

Архитектура Node.js

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

Основные компоненты:

  • V8 Engine — движок JavaScript от Google
  • Libuv — библиотека для работы с асинхронным I/O
  • Event Loop — цикл событий, управляющий асинхронными операциями
  • Modules System — система модулей (CommonJS / ESM)

Синтаксис и базовые понятия

Hello World:

console.log("Hello, World!");

Запуск:

node hello.js

Переменные:

let name = "Alice";
const age = 30;
var isDeveloper = true;

Функции:

function greet(name) {
    return `Hello, ${name}`;
}

console.log(greet("Bob"));

Callbacks:

function fetchData(callback) {
    setTimeout(() => {
        callback("Data received");
    }, 1000);
}

fetchData((data) => {
    console.log(data);
});

Promises:

function fetchData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => resolve("Data"), 1000);
    });
}

fetchData().then(data => console.log(data));

Async/Await:

async function getData() {
    const data = await fetchData();
    console.log(data);
}
getData();

Работа с файлами (FS)

const fs = require('fs');

// Чтение файла
fs.readFile('file.txt', 'utf8', (err, data) => {
    if (err) throw err;
    console.log(data);
});

// Запись файла
fs.writeFile('output.txt', 'New content', (err) => {
    if (err) throw err;
    console.log('File saved!');
});

Работа с HTTP

Простой HTTP-сервер:

const http = require('http');

const server = http.createServer((req, res) => {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Hello, World!\n');
});

server.listen(3000, '127.0.0.1', () => {
    console.log('Server running at http://127.0.0.1:3000/');
});

npm — менеджер пакетов

npm — это официальный менеджер пакетов для Node.js.

Установка пакета:

npm install express

Удаление:

npm uninstall express

Сохранение зависимостей:

npm init -y
npm install express --save
npm install eslint --save-dev

package.json:

Файл, описывающий проект и зависимости.


Популярные фреймворки и библиотеки

Web:

  • Express.js — минимальный и гибкий фреймворк
  • Fastify — быстрый и легковесный фреймворк
  • Koa.js — от создателей Express, более современный
  • NestJS — мощный фреймворк с поддержкой TypeScript

CLI:

  • Commander.js
  • Inquirer.js

Базы данных:

  • Mongoose (MongoDB)
  • Sequelize (PostgreSQL, MySQL и др.)
  • TypeORM

HTTP клиенты:

  • Axios
  • Got
  • Node-fetch

Автоматизация и скрипты:

  • ShellJS
  • Chalk — цветной вывод в консоль
  • Dotenv — загрузка переменных окружения из .env

Работа с шаблонизаторами

Пример с EJS:

const ejs = require('ejs');

ejs.renderFile('template.ejs', { name: 'Alice' }, (err, str) => {
    console.log(str);
});

Другие шаблонизаторы: - Pug - Handlebars - Mustache


Работа с базами данных

MongoDB + Mongoose:

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/testdb');

const Cat = mongoose.model('Cat', { name: String });

const kitty = new Cat({ name: 'Zildjian' });
kitty.save().then(() => console.log('Meow'));

PostgreSQL + Sequelize:

const { Sequelize } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
  host: 'localhost',
  dialect: 'postgres'
});

sequelize.authenticate().then(() => {
  console.log('Connection has been established successfully.');
});

Процессы и кластеризация

Cluster (многопроцессорное распределение нагрузки):

const cluster = require('cluster');
const os = require('os');

if (cluster.isPrimary) {
    const cpus = os.cpus().length;
    for (let i = 0; i < cpus; i++) {
        cluster.fork();
    }
} else {
    const http = require('http');
    http.createServer((req, res) => {
        res.end('Worker response\n');
    }).listen(3000);
}

Безопасность

Рекомендации:

  • Использовать HTTPS
  • Ограничивать права доступа
  • Использовать Helmet для безопасных HTTP-заголовков
  • Проверять входные данные
  • Использовать JWT для аутентификации
  • Хранить секреты в переменных окружения

Логирование и диагностика

Использование Winston:

const winston = require('winston');

const logger = winston.createLogger({
    level: 'info',
    format: winston.format.json(),
    transports: [
        new winston.transports.Console(),
        new winston.transports.File({ filename: 'combined.log' })
    ]
});

logger.info('Application started');

Отладка:

node --inspect-brk -r ts-node/register app.ts

Инструменты: - Winston - Bunyan - Debug - PM2 logs


Тестирование

Юнит-тестирование:

  • Jest — популярный фреймворк от Facebook
  • Mocha — гибкий фреймворк
  • Chai — assertion library

Пример с Jest:

// sum.js
function sum(a, b) {
    return a + b;
}
module.exports = sum;

// sum.test.js
const sum = require('./sum');

test('adds 1 + 2 to equal 3', () => {
    expect(sum(1, 2)).toBe(3);
});

Запуск:

jest

CI/CD и автоматизация

Node.js активно используется в процессах CI/CD: - GitHub Actions - GitLab CI - Travis CI - CircleCI - Jenkins

Также можно использовать: - Docker — контейнеризация - PM2 — процесс-менеджер - Webpack / Vite — сборка фронтенда


Документирование

Node.js проекты могут использовать: - JSDoc - TypeDoc (для TypeScript) - Swagger/OpenAPI (для REST API)


Поддержка и сообщество

Официальные источники: