Оглавление
Node.js
JavaScript на сервере: модули и npm, файлы, потоки, процессы и HTTP-сервер без фреймворков.
1.Начало работы
- Что такое Node.jsЗачем нужен Node.js, чем он отличается от браузера и как его установить.
- Запуск программыКак создать файл с кодом, запустить его командой node и перезапускать при изменениях.
- REPL — интерактивный режимКак проверять код построчно в интерактивном режиме Node.js и какие у него есть команды.
- package.json и npm initЧто такое файл package.json, как создать его командой npm init и какие поля в нём важны.
- ES-модули и CommonJSКак делить программу на файлы с import и export и чем ES-модули отличаются от CommonJS с require.
- Установка пакетовКак ставить библиотеки из npm, чем dependencies отличаются от devDependencies и зачем нужен package-lock.json.
- Скрипты npm и npxКак описать команды проекта в разделе scripts, запускать их через npm run и пользоваться npx.
2.Программа и окружение
- Аргументы командной строкиОбъект process и массив process.argv: как передать программе данные при запуске.
- Коды завершенияКак программа сообщает об успехе или ошибке: process.exitCode, process.exit() и проверка кода в терминале.
- Переменные окружения и .envНастройки программы в process.env, файл .env и его загрузка флагом --env-file.
- Пути: node:path и import.meta.dirnameКак собирать пути к файлам модулем node:path и находить папку текущего модуля через import.meta.dirname.
3.Файлы
- Чтение и запись файловМодуль node:fs/promises: как записать файл, прочитать его, дописать в конец и обработать отсутствие файла.
- Работа с папкамиКак создать папку, получить список файлов, отличить файлы от папок и удалить папку в node:fs/promises.
- JSON-файл как хранилищеКак хранить статьи блога в JSON-файле: чтение, добавление записи и сохранение, вынесенные в отдельный модуль.
- Потоки: большие файлы по частямПотоки чтения и записи в Node.js: построчное чтение большого файла, копирование и сжатие через pipeline.
4.Асинхронность в Node.js
- Цикл событий и таймерыКак Node.js выполняет асинхронный код: цикл событий, setTimeout, setImmediate, process.nextTick и таймеры на промисах.
- События и EventEmitterКласс EventEmitter из node:events: подписка на события, их отправка, одноразовые обработчики и событие error.
- Ошибки в асинхронном кодеКак перехватывать ошибки в async-функциях, что такое необработанный отказ промиса и почему он завершает программу.
5.HTTP без фреймворков
- Модуль http: первый серверСвой веб-сервер на встроенном модуле node:http: запрос и ответ, код состояния, заголовки и порт.
- Маршруты вручнуюКак разбирать адрес запроса классом URL и выбирать ответ по методу и пути: список статей, статья по номеру, 404.
- Раздача статических файловКак отдавать HTML, CSS и картинки из папки public: тип содержимого по расширению, 404 и защита от выхода за пределы папки.
- Тело запроса и JSON APIКак прочитать тело POST-запроса в node:http, разобрать JSON, проверить данные и создать статью с ответом 201.
- HTTP-запросы через fetchКак Node.js сам отправляет запросы к другим серверам: fetch, проверка ответа, отправка JSON и ограничение времени ожидания.
6.Инструменты и практика
- Дочерние процессыКак запустить из Node.js другую программу: execFile для короткого результата и spawn для долгих команд с выводом.
- Worker threadsКак вынести тяжёлое вычисление в отдельный поток модулем node:worker_threads, чтобы сервер не зависал.
- Основы node:cryptoХеширование, случайные идентификаторы и токены, хранение паролей через scrypt во встроенном модуле node:crypto.
- Встроенный тестовый модульАвтоматические тесты без библиотек: node:test, проверки node:assert и запуск командой node --test.
- ОтладкаКак искать ошибки в программе на Node.js: полезные методы console, флаг --inspect, точки остановки и отладчик в редакторе.
- База данных SQLiteКак хранить статьи блога в базе SQLite через встроенный модуль node:sqlite: таблица, вставка, выборка и параметры.
- Утилита командной строкиКак написать свою консольную программу: разбор флагов функцией parseArgs, вопросы пользователю через readline и запуск по имени.
- Развёртывание на сервереКак запустить блог на сервере: установка зависимостей, переменные окружения, менеджер процессов pm2, журналы и корректная остановка.