Я использовал Node.js в нескольких проектах для back-end наряду с React для front-end. Во время работы над одним из проектов мне стало интересно, как Node.js работает, и понял, что, хотя я знаю, как использовать Node.js Я действительно не понимал, почему он работает так, как работает. Мне захотелось узнать больше, и я решил написать короткий и простой блог, посвященный истории его внедрения и высокоуровневому обзору его работы для новичков.
Для кого этот блог:
✅ Люди, которые только начинают программировать и хотят получить лучшее концептуальное понимание того, как работает Node.js.
Для кого этот блог не предназначен:
❌ Тем, кто ищет подробное руководство по всем внутренним аспектам работы Node.js.
Node.js - это кроссплатформенная среда выполнения JavaScript с открытым исходным кодом, которая используется для запуска веб-приложений вне браузера клиента.
Открытый исходный код - программа находится в свободном доступе для разработчиков, которые могут использовать ее и вносить в нее свой вклад.
Кроссплатформенность - программа может работать на нескольких операционных системах - Windows, OSX и Linux.
Среда выполнения - Среда выполнения любого языка программирования - это среда, в которой можно выполнять код, написанный на этом языке. До появления Node.js JavaScript выполнялся только в браузере. Node.js позволяет выполнять JavaScript-код без браузера, что делает возможным использование JavaScript для написания сценариев на стороне сервера.
Изначально Node.js был разработан Райаном Далом, который критиковал блокирующий ввод-вывод наиболее популярного в то время веб-сервера Apache HTTP server и сложную библиотеку зависимостей 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 является средой выполнения JavaScript, она была написана в основном на языке C/C++, который имеет множество возможностей, позволяющих ей напрямую взаимодействовать с машинными операционными системами.
Node.js состоит из нескольких зависимостей, но две основные из них - V8 и libuv. V8 разработан компанией Google и компилирует JavaScript-код непосредственно в код на языке C++, предоставляя среду выполнения JavaScript, полностью независимую от браузера, в котором он выполняется. Libuv - это многоплатформенная библиотека C++, обеспечивающая поддержку асинхронных операций ввода-вывода, таких как файловая система, работа в сети, параллелизм, и управляющая циклом событий в Node.js.
Благодаря Libuv Node.js позволяет нам создавать неблокирующий асинхронный код для наших внутренних приложений, используя цикл событий, чтобы программа могла продолжать выполняться в ожидании задач, которые могут занять больше времени, например HTTP-запросов или получения данных из базы данных.
После запуска Node.js программа начинает с синхронного выполнения кода и только после выполнения входного скрипта переходит в цикл событий для выполнения асинхронных обратных вызовов API. Цикл событий определяет порядок выполнения обратных вызовов и состоит из различных очередей, которые обрабатывают макро- и микрозадачи в порядке приоритета. Цикл событий скрыт от пользователя, подобно среде выполнения браузера.
Плюсы:
Асинхронная, управляемая событиями модель ввода/вывода, обеспечивающая легкость и высокую скорость отклика.
Фронтенд и бэкенд приложений могут быть написаны на JavaScript, что позволяет компаниям экономить время и средства за счет найма full-stack разработчиков, а не отдельных команд для фронтенда и бэкенда.
Работает на движке 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://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