Создано искусственным интеллектомУлучшено людьми

Riqli · живые документы · обновляются постоянно

Где знания об искусственном интеллекте встречаются с человеческой практикой.

Поделиться с друзьями
image

Node.js. Базовый курс от основ до простых realtime коммуникаций. Soft skill. (Node js basics. Основы node js. Node js для начинающих. Event loop node js. Self-study. Training. Coaching.)

разделы

Основы Node.js и асинхронная модель

В этом разделе рассматриваются базовые концепции платформы Node.js, ее отличия от браузерного JavaScript и сравнение с другими серверными технологиями, такими как PHP.

содержимое

Ключевое отличие Node.js от браузерного JavaScript — среда выполнения. В браузере мы манипулируем DOM, а в Node.js создаем веб-серверы, обрабатываем запросы и работаем с файловой системой. Синтаксис языка остается тем же, но меняются цели и подходы.

содержимое

Сравнение с PHP: В PHP для каждого запроса создается новый процесс, который стартует с чистого листа. В Node.js запускается один процесс, который обрабатывает все запросы в рамках одного event loop. Это позволяет легко создавать общие переменные и кэшировать данные в памяти между запросами, но требует осторожности с долгими синхронными операциями.

содержимое

Основой асинхронности в Node.js является event loop. Он представляет собой бесконечный цикл, который выполняет задачи из очередей. Существует два типа задач: macro tasks (макрозадачи, например, `setTimeout`, `setInterval`, I/O) и micro tasks (микрозадачи, например, Promise). Сначала выполняется весь синхронный код, затем все микрозадачи, и только потом — макрозадача.

содержимое

Программа на Node.js завершается, когда в event loop не остается активных macro tasks. Если в коде есть вызов `setTimeout` с колбэком, программа не завершится, пока не пройдет заданное время и колбэк не будет выполнен. Бесконечный цикл синхронного кода (`while(true)`) сделает программу вечно занятой и неспособной обрабатывать другие задачи.

содержимое

Долгая синхронная вычислительная задача (например, цикл на миллиард итераций) блокирует event loop. Пока она выполняется, Node.js не может обрабатывать другие запросы клиентов или выполнять другие асинхронные операции. Все остальные клиенты будут вынуждены ждать завершения этой задачи, что приводит к задержкам.

содержимое

Для разбиения длинной синхронной задачи на части, чтобы не блокировать event loop, можно использовать рекурсию с `setImmediate` или `setTimeout(fn, 0)`. Каждая итерация будет планировать следующую как новую макрозадачу, позволяя циклу обрабатывать другие ожидающие задачи (например, запросы других клиентов) между итерациями.

разделы

Работа с модулями в Node.js

В этом разделе рассматриваются системы модулей в Node.js: CommonJS (устаревшая, но широко используемая) и ECMAScript Modules (ESM) (современный стандарт).

содержимое

Современный стандарт в Node.js — это ECMAScript Modules (ESM) с ключевыми словами `import` и `export`. Для их использования необходимо установить `"type": "module"` в файле package.json или использовать расширение файла `.mjs`. Старая система — CommonJS с `require()` и `module.exports`.

содержимое

Node.js имеет набор встроенных (core) модулей, которые не нужно устанавливать отдельно. Примеры: `http` для создания сервера, `fs` для работы с файловой системой, `path` для работы с путями. Они импортируются без указания пути (например, `import fs from 'fs'`).

содержимое

При импорте в ES Modules рекомендуется указывать полный путь к файлу, включая расширение (например, `import { myFunc } from './my-file.js'`). Без расширения или с неполным путем поведение может быть неоднозначным (файл или папка?), что является одним из недостатков дизайна модулей в Node.js.

разделы

Создание простого веб-сервера и его особенности

В этом разделе рассматривается создание базового HTTP-сервера с использованием встроенного модуля `http`, а также специфика обработки запросов от клиентов.

содержимое

Для создания веб-сервера используется встроенный модуль http. Метод `createServer` возвращает сервер, который начинает слушать указанный порт с помощью метода `listen`. Важно: сервер будет работать постоянно, так как он создает активную макрозадачу (прослушивание порта), не давая event loop опустеть.

содержимое

Общая переменная, объявленная в корне скрипта сервера, будет единой для всех подключений. Например, счетчик посещений будет увеличиваться для каждого клиента. В PHP для такого поведения пришлось бы использовать базу данных или Redis, так как каждый запрос обрабатывается в изолированном процессе. Это ключевая особенность Node.js.

разделы

Асинхронные вычисления и модуль Worker Threads

В этом разделе рассматривается модуль `worker_threads` для выноса тяжелых синхронных вычислений в отдельные потоки, чтобы не блокировать основной event loop.

содержимое

Модуль worker_threads позволяет создавать изолированные потоки (воркеры) для выполнения тяжелых синхронных задач на других ядрах процессора. Основной поток и воркер могут обмениваться сообщениями через событийную модель (`postMessage`, `on('message')`). Это не панацея, но может помочь в определенных сценариях.

содержимое

Более надежной альтернативой выносу тяжелых задач в отдельные потоки является использование систем очередей. Например, добавить задачу в базу данных, а отдельный процесс (например, по крону или через PM2) будет забирать их из очереди и выполнять последовательно или в ограниченном количестве. Это предотвращает перегрузку сервера в пиковые нагрузки.

разделы

Среда выполнения Node.js и браузерный JavaScript

В этом разделе рассматриваются базовые концепции платформы Node.js, ее отличия от браузерного JavaScript и сравнение с другими серверными технологиями, такими как PHP.

содержимое

Ключевое отличие Node.js от браузерного JavaScript — среда выполнения. В браузере мы манипулируем DOM, а в Node.js создаем веб-серверы, обрабатываем запросы и работаем с файловой системой. Синтаксис языка остается тем же, но меняются цели и подходы.

содержимое

Сравнение с PHP: В PHP для каждого запроса создается новый процесс, который стартует с чистого листа. В Node.js запускается один процесс, который обрабатывает все запросы в рамках одного event loop. Это позволяет легко создавать общие переменные и кэшировать данные в памяти между запросами, но требует осторожности с долгими синхронными операциями.

разделы

Цикл событий (Event Loop) и асинхронность

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

содержимое

Основой асинхронности в Node.js является event loop. Он представляет собой бесконечный цикл, который выполняет задачи из очередей. Существует два типа задач: macro tasks (макрозадачи, например, setTimeout, setInterval, I/O) и micro tasks (микрозадачи, например, Promise). Сначала выполняется весь синхронный код, затем все микрозадачи, и только потом — макрозадача.

содержимое

Программа на Node.js завершается, когда в event loop не остается активных macro tasks. Если в коде есть вызов setTimeout с колбэком, программа не завершится, пока не пройдет заданное время и колбэк не будет выполнен. Бесконечный цикл синхронного кода (while(true)) сделает программу вечно занятой и неспособной обрабатывать другие задачи.

содержимое

Долгая синхронная вычислительная задача (например, цикл на миллиард итераций) блокирует event loop. Пока она выполняется, Node.js не может обрабатывать другие запросы клиентов или выполнять другие асинхронные операции. Все остальные клиенты будут вынуждены ждать завершения этой задачи, что приводит к задержкам.

содержимое

Для разбиения длинной синхронной задачи на части, чтобы не блокировать event loop, можно использовать рекурсию с setImmediate или setTimeout(fn, 0). Каждая итерация будет планировать следующую как новую макрозадачу, позволяя циклу обрабатывать другие ожидающие задачи (например, запросы других клиентов) между итерациями.

разделы

Системы модулей: CommonJS и ESM

В этом разделе рассматриваются системы модулей в Node.js: CommonJS (устаревшая, но широко используемая) и ECMAScript Modules (ESM) (современный стандарт).

содержимое

Современный стандарт в Node.js — это ECMAScript Modules (ESM) с ключевыми словами import и export. Для их использования необходимо установить "type": "module" в файле package.json или использовать расширение файла .mjs. Старая система — CommonJS с require() и module.exports.

содержимое

Node.js имеет набор встроенных (core) модулей, которые не нужно устанавливать отдельно. Примеры: http для создания сервера, fs для работы с файловой системой, path для работы с путями. Они импортируются без указания пути (например, import fs from 'fs').

содержимое

При импорте в ES Modules рекомендуется указывать полный путь к файлу, включая расширение (например, import { myFunc } from './my-file.js'). Без расширения или с неполным путем поведение может быть неоднозначным (файл или папка?), что является одним из недостатков дизайна модулей в Node.js.

разделы

Создание HTTP-сервера и обработка запросов

В этом разделе рассматривается создание базового HTTP-сервера с использованием встроенного модуля http, а также специфика обработки запросов от клиентов.

содержимое

Для создания веб-сервера используется встроенный модуль http. Метод createServer возвращает сервер, который начинает слушать указанный порт с помощью метода listen. Важно: сервер будет работать постоянно, так как он создает активную макрозадачу (прослушивание порта), не давая event loop опустеть.

содержимое

Общая переменная, объявленная в корне скрипта сервера, будет единой для всех подключений. Например, счетчик посещений будет увеличиваться для каждого клиента. В PHP для такого поведения пришлось бы использовать базу данных или Redis, так как каждый запрос обрабатывается в изолированном процессе. Это ключевая особенность Node.js.

разделы

Многопоточность и фоновые задачи

В этом разделе рассматривается модуль worker_threads для выноса тяжелых синхронных вычислений в отдельные потоки, а также альтернативные архитектурные подходы.

содержимое

Модуль worker_threads позволяет создавать изолированные потоки (воркеры) для выполнения тяжелых синхронных задач на других ядрах процессора. Основной поток и воркер могут обмениваться сообщениями через событийную модель (postMessage, on('message')). Это не панацея, но может помочь в определенных сценариях.

содержимое

Более надежной альтернативой выносу тяжелых задач в отдельные потоки является использование систем очередей. Например, добавить задачу в базу данных, а отдельный процесс (например, по крону или через PM2) будет забирать их из очереди и выполнять последовательно или в ограниченном количестве. Это предотвращает перегрузку сервера в пиковые нагрузки.


вопросы

В чем заключается ключевое различие между использованием JavaScript в браузере и в среде Node.js?

ответыПравильный

В среде выполнения: в браузере мы работаем с DOM, а в Node.js создаем серверные приложения.

объяснения

В Node.js нет объектов `window` или `document`. Вместо этого у нас есть глобальные объекты для работы с сервером, файловой системой (`fs`), сетью (`http`), что позволяет создавать веб-серверы и инструменты командной строки на JavaScript.

ответыНеправильный

В синтаксисе языка и типах данных.


вопросы

Почему в Node.js легко создать переменную, общую для всех пользователей сайта, в отличие от PHP?

ответыПравильный

Потому что в Node.js один процесс обрабатывает все запросы в рамках одного event loop, в отличие от PHP, где для каждого запроса создается новый процесс.

объяснения

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

ответыНеправильный

Потому что Node.js использует многопоточность, а PHP — однопоточную модель.


вопросы

Что такое event loop в контексте Node.js?

ответыПравильный

Это бесконечный цикл, который управляет очередью асинхронных задач (macro и micro tasks) и обеспечивает неблокирующую асинхронную модель выполнения.

объяснения

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

ответыНеправильный

Это библиотека для работы с событиями в браузере.


вопросы

Почему следующий код Node.js завершится не сразу, а через 3 секунды: setTimeout(() => console.log('Done'), 3000);

ответыПравильный

Потому что в event loop активна одна macro task (таймер), которая будет выполнена через 3 секунды, и только после этого цикл опустеет и программа завершится.