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)
Поддержка и сообщество
Официальные источники:
- https://nodejs.org
- https://nodejs.org/en/docs/ — официальная документация