Веб-разработка

Учебник Node.js для начинающих

41 урок · 10 разделов · бесплатно, без регистрации

Node.js выводит JavaScript за пределы браузера: на нём пишут веб-серверы, REST API, утилиты и инструменты разработки. Этот курс — для тех, кто уже знаком с базовым JavaScript и хочет научиться писать серверный код. Вы пройдёте путь от первого скрипта и модульной системы до собственного REST API на Express: разберётесь, как устроен событийный цикл и асинхронность, научитесь работать с файлами и окружением, поднимать веб-сервер и грамотно обрабатывать ошибки. К концу курса вы будете понимать, как устроено серверное приложение на Node, и сможете строить его сами.

Курс «Node.js» состоит из 10 разделов и 41 урока: Введение в Node.js, Модули и npm, Асинхронность, Работа с системой, HTTP и веб-сервер, Практика: REST API на Express, Событийный цикл и libuv вглубь, Потоки, буферы и события, Параллелизм и многопроцессность и Node.js в продакшене. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.

Программа курса

  1. 1 Введение в Node.js

    1. Что такое Node.js: JavaScript вне браузера

      Node.js — это среда выполнения JavaScript на движке V8 вне браузера. Разбираемся, что это, где применяется и почему так популярна.

    2. Установка Node.js и проверка версии

      Как установить Node.js, проверить версию через node -v и npm -v, что такое LTS и зачем нужен менеджер версий nvm.

    3. REPL и первый скрипт

      Интерактивный режим REPL для экспериментов и запуск файла через node app.js — два способа выполнять JavaScript в Node.js.

    4. Чем серверный JavaScript отличается от браузерного

      В Node.js нет window и DOM, зато есть process, fs и глобальные объекты Node. Разбираем ключевые отличия серверного JS от браузерного.

  2. 2 Модули и npm

    1. CommonJS: require и module.exports

      Как Node разбивает код на модули по системе CommonJS: экспорт через module.exports и импорт через require. Каждый файл — отдельный модуль.

    2. ES-модули: import и export

      Современный синтаксис модулей в Node.js: import/export, отличия от CommonJS, как включить ESM через type module и расширение mjs.

    3. Встроенные модули Node

      Node поставляется с набором встроенных модулей: fs, path, http, os, crypto и другими. Как их подключать без установки и зачем нужны.

    4. npm и package.json

      npm — менеджер пакетов Node. Что такое package.json, npm install, dependencies vs devDependencies, node_modules и package-lock.json.

    5. npm-скрипты: автоматизация команд

      Раздел scripts в package.json позволяет давать длинным командам короткие имена и запускать их через npm run. start, test и пользовательские скрипты.

  3. 3 Асинхронность

    1. Событийный цикл наглядно

      Event loop простыми словами: почему Node однопоточный, но не блокируется. Стек вызовов, очередь задач и кто их забирает.

    2. Колбэки и callback hell

      Колбэк — функция, которую вызывают по завершении операции. Что такое callback hell и почему вложенные колбэки трудно читать.

    3. Промисы

      Promise — объект-обещание будущего результата. then, catch, цепочки и Promise.all вместо вложенных колбэков в Node.

    4. async/await

      async/await — синтаксис, делающий асинхронный код похожим на синхронный. await ждёт промис, try/catch ловит ошибки.

  4. 4 Работа с системой

    1. Файловая система: чтение и запись (модуль fs)

      Модуль fs для работы с файлами в Node: чтение и запись, синхронные и асинхронные методы, версия на промисах.

    2. Пути к файлам (модуль path)

      Модуль path в Node для безопасной работы с путями: join, resolve, basename, extname и переменные __dirname / __filename.

    3. Переменные окружения и аргументы

      process.env для переменных окружения и process.argv для аргументов командной строки — как настраивать Node-приложения снаружи.

    4. Потоки (streams): обзор

      Streams в Node обрабатывают данные по частям, не загружая всё в память. Зачем нужны потоки, их типы и идея pipe.

  5. 5 HTTP и веб-сервер

    1. Простейший сервер на модуле http

      Создаём веб-сервер на встроенном модуле http: createServer, объекты req и res, listen на порту. Основа всех Node-серверов.

    2. Маршрутизация вручную

      Как на чистом модуле http разводить запросы по URL и методу: ручная маршрутизация, ответы 404 и почему это утомительно без фреймворка.

    3. Знакомство с Express

      Express — минималистичный веб-фреймворк для Node. Установка, app.get/app.post, объекты req и res, запуск сервера через listen.

    4. Middleware и разбор JSON

      Middleware в Express — функции в конвейере обработки запроса. Что такое next, express.json() для разбора тела и логирующий middleware.

  6. 6 Практика: REST API на Express

    1. REST API на Express: CRUD

      Строим REST API на Express: CRUD-операции над списком в памяти, маршруты GET/POST/PUT/DELETE и правильные HTTP-статусы.

    2. Обработка ошибок

      Как обрабатывать ошибки в Express и Node: try/catch в async-маршрутах, error-handling middleware с четырьмя аргументами и валидация входных данных.

    3. Подключение к базе данных: обзор

      Как Node работает с базами данных: SQL и NoSQL, драйверы и ORM, пул соединений и почему запросы к БД асинхронны. Обзорный урок.

    4. Структура проекта и что дальше

      Как организовать реальный Node-проект: routes, controllers, services, models. Куда расти дальше: NestJS, тесты, TypeScript и деплой.

  7. 7 Событийный цикл и libuv вглубь

    1. Фазы событийного цикла

      Разбор фаз событийного цикла Node.js: timers, pending, poll, check, close. Как libuv крутит цикл и почему Node однопоточный, но неблокирующий.

    2. Микрозадачи: process.nextTick и промисы

      Микрозадачи в Node.js: чем microtask отличается от macrotask, почему очередь process.nextTick идёт перед промисами и как не уморить событийный цикл голодом.

    3. setTimeout, setImmediate и порядок

      Разница setImmediate и setTimeout(0) в Node.js: почему порядок на верхнем уровне недетерминирован, а внутри I/O-колбэка setImmediate всегда первым.

    4. Что блокирует цикл и как не блокировать

      Что блокирует событийный цикл Node.js: синхронные тяжёлые операции, sync-методы fs и crypto. Как выносить CPU-нагрузку и мониторить лаг цикла.

  8. 8 Потоки, буферы и события

    1. Buffer: бинарные данные в Node

      Buffer в Node.js: зачем нужны бинарные данные, кодировки utf-8/hex/base64, чтение и запись байтов, разница между Buffer и строкой, типичные ошибки с кодировкой.

    2. Потоки: Readable и Writable

      Потоки в Node.js: зачем обрабатывать большие данные по кускам, Readable и Writable, режимы flowing и paused, события data, end и error, метод write.

    3. pipe, Transform и backpressure

      pipe и pipeline в Node.js: как соединять потоки, Transform-потоки для преобразования данных, что такое backpressure и почему обратное давление важно для памяти.

    4. EventEmitter: основа событийной модели

      EventEmitter в Node.js: методы on, emit и once, паттерн издатель-подписчик, утечки слушателей и maxListeners, обязательная обработка события error.

  9. 9 Параллелизм и многопроцессность

    1. worker_threads: настоящие потоки для CPU-задач

      worker_threads в Node.js: настоящие потоки внутри одного процесса для тяжёлых вычислений, обмен сообщениями через MessagePort, передача буферов и кратко про SharedArrayBuffer.

    2. cluster: масштабирование на все ядра

      Модуль cluster в Node.js: один процесс использует одно ядро, мастер форкает воркеры по числу ядер, они слушают общий порт, а ОС или Node балансируют входящие соединения.

    3. child_process: запуск внешних программ

      Модуль child_process в Node.js: spawn, exec, execFile и fork, потоки stdio дочернего процесса, когда какой метод выбрать и почему важна безопасная передача аргументов без оболочки.

    4. Когда параллелизм нужен (и когда нет)

      Выбор параллелизма в Node.js: чем отличаются I/O-bound и CPU-bound задачи, почему для ввода-вывода хватает событийного цикла и когда брать worker_threads, cluster или child_process.

  10. 10 Node.js в продакшене

    1. Обработка ошибок: uncaughtException, промисы

      Как правильно обрабатывать ошибки в Node.js: try/catch в async, unhandledRejection, uncaughtException, почему нельзя «глотать» ошибки и graceful shutdown по SIGTERM.

    2. Логи и конфигурация

      Структурированные логи вместо console.log, уровни логирования, конфигурация через переменные окружения, принципы 12-factor и почему секреты не хранят в коде.

    3. Безопасность Node-приложения

      Оборонительная защита Node-приложения: валидация ввода, защита от инъекций, заголовки helmet, ограничение размера тела запроса, npm audit и запуск не от root.

    4. Тестирование и эксплуатация

      Тестирование Node через node:test и Jest, что именно тестировать, менеджеры процессов pm2 и systemd, автоматический рестарт, кластеризация и мониторинг здоровья.