Я использовал Node.js в нескольких проектах для своей серверной части наряду с React для своего внешнего интерфейса. Недавно во время работы над проектом мне стало интересно, как работает Node.js, и я понял, что, хотя я знаю, как использовать Node.js, я действительно не понимаю, почему он работает именно так. Я хотел узнать больше и решил написать короткий и простой блог об истории его реализации и общий обзор того, как он работает для начинающих.
Для кого этот блог:
✅ Люди, которые плохо знакомы с программированием и хотят лучше понять, как работает Node.js.
Для кого не предназначен этот блог:
❌ Кто-то ищет подробное руководство по внутренней работе Node.js.
Что такое Node.js?
Node.js — это кроссплатформенная среда выполнения JavaScript с открытым исходным кодом, которая используется для запуска веб-приложений вне браузера клиента.
Открытый исходный код – программа предоставляется бесплатно разработчикам, которые могут использовать ее и вносить в нее свой вклад.
Кроссплатформенность – может работать в нескольких операционных системах — Windows, OSX и Linux.
Среда выполнения. Среда выполнения любого языка программирования – это среда, в которой вы можете выполнять код, написанный на этом языке. До Node.js JavaScript выполнялся только в браузере. Node.js позволяет выполнять код JavaScript без браузера, что позволяет использовать JavaScript для сценариев на стороне сервера.
Краткая история:
Node.js изначально был разработан Райаном Далем, который раскритиковал блокирующий характер ввода-вывода самого популярного веб-сервера того времени, HTTP-сервера Apache и сложной библиотеки зависимостей Nginx, конкурента Apache в пространстве веб-серверов.
Одним из его самых больших аргументов против Apache было использование памяти, необходимое при увеличении количества одновременных запросов. Apache является многопоточным и настроен таким образом, чтобы каждый поток мог выполнять задачи независимо друг от друга, используя при этом один и тот же ресурс. Однако для каждой задачи требуется отдельный контекст выполнения, который занимает память и может привести к замедлению времени ответа по мере увеличения количества одновременных запросов.
Node.js представил облегченную среду выполнения JavaScript, управляемую событиями. Как и среда выполнения JavaScript в браузере, Node.js использует цикл событий и обратные вызовы для делегирования задач, которые занимают некоторое время, отдельному компоненту, продолжая при этом поток выполнения. Кроме того, в Node.js было меньше зависимостей, что делало его легким и отзывчивым.
Позже Node.js стал спонсироваться компанией Joyent после того, как Райан Даль выступил с презентацией новой технологии и ее возможностей на JSConf в 2009 году.
Райан Дал был не первым, кто придумал идею серверного программирования. Netscape, создавшая самую раннюю версию JavaScript, имела среду выполнения под названием Netscape LiveWire, которая позволяла пользователям использовать JavaScript для создания серверных приложений. Однако эта технология не имела успеха отчасти потому, что в то время JavaScript не так широко использовался. Выпуск Node.js произошел в идеальное время, поскольку JavaScript стал рассматриваться более серьезно благодаря современным веб-браузерам, использующим эту технологию для создания динамических веб-сайтов.
Как работает Node.js:
Хотя Node.js представляет собой среду выполнения JavaScript, он в основном был написан на C/C++, который имеет множество функций, позволяющих напрямую взаимодействовать с операционными системами компьютеров.
Node.js состоит из нескольких зависимостей, но две основные из них — это движок V8 и libuv. V8 разработан Google и компилирует код JavaScript непосредственно в код C++, обеспечивая среду выполнения для выполнения JavaScript, полностью независимую от браузера, в котором он запускается. Libuv — это многоплатформенная библиотека C++, которая обеспечивает поддержку асинхронных операций ввода-вывода, таких как файловая система, сеть и параллелизм, а также управляет циклом событий в Node.js.
С помощью Libuv Node.js позволяет нам создавать неблокирующий асинхронный код для наших серверных приложений, используя цикл событий, чтобы программа могла продолжать выполняться, пока она ожидает задач, выполнение которых может занять больше времени, таких как HTTP-запросы или получение данных от база данных.
После запуска Node.js программа начинает синхронное выполнение кода, и только после выполнения входного сценария она входит в цикл событий для выполнения любых асинхронных обратных вызовов API. Цикл событий определяет порядок, в котором будут выполняться обратные вызовы, и состоит из различных очередей, которые обрабатывают макро-/микрозадачи в порядке приоритета. Цикл событий скрыт от пользователя, как и в среде выполнения браузера.
Плюсы и минусы Node.js:
Плюсы:
Асинхронная модель ввода-вывода, управляемая событиями, что делает ее легкой и быстродействующей.
Интерфейсная и серверная части приложений могут быть написаны на JavaScript, что может помочь компаниям сэкономить время и расходы за счет найма разработчиков полного цикла вместо необходимости использования отдельных команд для внешнего и внутреннего интерфейса.
Оснащен двигателем V8, который компания Googe постоянно совершенствует и инвестирует в него.
Минусы:
На производительность влияют задачи с интенсивным использованием ЦП, такие как сложные вычисления или сжатие видео, выполнение которых занимает некоторое время и блокирует основной поток. Хотя Node.js может обрабатывать параллельные задачи, используя цикл событий, он был разработан для обработки обратных вызовов, решение которых не займет много времени.
Node.js постоянно вносит изменения в свой API, иногда делая его несовместимым с существующими проектами. Разработчикам приходится тратить время на переписывание своих программ, чтобы сделать их совместимыми с этими изменениями, вместо того, чтобы тратить это время на работу над улучшениями.
Резюме:
Node.js — это чрезвычайно легкая и масштабируемая программа для бэкэндов, которая в настоящее время используется многими крупными компаниями, включая, помимо прочего, Netflix, PayPal и Walmart, что делает ее очень подходящей для широкого спектра проектов.
Источники:
https://bytearcher.com/articles/parallel-vs-concurrent/
https://www.geeksforgeeks.org/node-js-vs-express-js/
https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/Introduction
https://medium.com/nerd-for-tech/nodejs-short-history-and-milestones-b1708a0c6488
https://www.codecademy.com/article/introduction-to-javascript-runtime-environments
https://www.geeksforgeeks.org/explain-the-working-of-node-js/
https://www.freecodecamp.org/news/what-exactly-is-node-guide-for-beginners/
https://dev.to/_staticvoid/node-js-under-the-hood-1-getting-to-know-our-tools-1465
https://resources.risingstack.com/Node.js+at+Scale+Vol.+2+-+Node.js+Under+the+Hood.pdf
https://www.builder.io/blog/visual-guide-to-nodejs-event-loop