Node.js — это программная платформа, построенная на основе движка JavaScript V8, разработанная с целью создания масштабируемых и быстрых сетевых приложений. Node.js позволяет выполнять JavaScript на серверной стороне и предоставляет API для работы с файловой системой, сетевыми протоколами и другими операциями ввода-вывода. Он используется для создания веб-серверов, инструментов командной строки, микросервисов и других приложений на основе сетевых протоколов. Node.js также позволяет легко управлять одновременными подключениями и обработкой запросов, а благодаря использованию асинхронных операций имеет высокую производительность. Отличным примером применения Node.js, и великолепным дополнением к ней является Node-RED. Node.js применяется преимущественно на сервере, выполняя роль веб-сервера, но есть возможность разрабатывать на Node.js и десктопные оконные приложения (при помощи NW.js, AppJS или Electron для Linux, Windows и macOS) и даже программировать микроконтроллеры (например, tessel, low.js и Espruino). В основе Node.js лежит событийно-ориентированное и асинхронное (или реактивное) программирование с неблокирующим вводом/выводом.
Node.js разработал Райан Даль в 2009 году после двух лет экспериментирования над созданием серверных веб-компонентов. В ходе своих исследований он пришёл к выводу, что вместо традиционной модели параллелизма на основе потоков следует обратиться к событийно-ориентированным системам. Эта модель была выбрана из-за простоты, низких накладных расходов (по сравнению с идеологией «один поток на каждое соединение») и быстродействия. Целью Node является предложить «простой способ построения масштабируемых сетевых серверов».
Разработка Node.js спонсируется компанией Joyent.
В декабре 2014 года был создан форк io.js.
В мае 2015 года было принято решение о слиянии io.js и Node.js и дальнейшем развитии под эгидой Node.js Foundation.
8 сентября 2015 года вышел Node.js v4.0.0 как результат слияния Node.js v0.12.7 и io.js v3.3.0.
Важными событиями в развитии платформы стало появление Atomics и SharedArrayBuffer в Node.js 9, а также worker_threads в Node.js 10.5 (и существенное развитие в Node.js 12). Это позволило создавать многопоточные параллельные приложения, реализовывать примитивы параллельного программирования и работать с разделяемой памятью. Также Node.js поддерживает работу с базами данных, как основанными на sql, так и с mongoDB.
Преимущества Node.js:
1. Высокая производительность: Node.js использует асинхронную модель ввода-вывода, что позволяет обрабатывать большое количество запросов с минимальной нагрузкой на сервер.
2. Быстрое разработка: Node.js использует JavaScript, что упрощает и ускоряет процесс разработки, особенно для разработчиков, знакомых с этим языком.
3. Обширная эко-система: Node.js имеет множество библиотек и фреймворков, которые упрощают и ускоряют разработку приложений.
4. Масштабируемость: Node.js легко масштабируется горизонтально, что позволяет обрабатывать большой объем запросов без увеличения нагрузки на сервер.
5. Одноязычность: использование JavaScript как языка программирования для клиентской и серверной части приложения позволяет разработчикам использовать один язык на всех уровнях приложения, что упрощает разработку, отладку и поддержку приложения, а также облегчает обнаружение и исправление ошибок.
Недостатки Node.js:
1. Вертикальное масштабирование: Node.js имеет некоторые ограничения в отношении масштабирования вертикально, то есть увеличения производительности на одном сервере с помощью увеличения вычислительной мощности или ресурсов.
2. Не подходит для CPU-интенсивных задач: из-за однопоточности и событийного цикла, Node.js не рекомендуется для выполнения CPU-интенсивных задач, таких как математические вычисления.
3. Ограниченные возможности работы с базами данных: Node.js имеет хорошую поддержку для NoSQL баз данных, но для реляционных баз данных необходимы дополнительные модули и плагины.
4. Необходимость разбивки приложения на микросервисы: в связи с однопоточным характером Node.js, приложение может стать медленным и нереагирующим, если одна часть приложения требует значительных ресурсов.
5. Меньшее количество разработчиков: на рынке существует меньше разработчиков, специализирующихся на Node.js, по сравнению с другими языками программирования, что может привести к затруднениям при найме квалифицированного персонала.