Node.js
Node.js — кроссплатформенная свободная среда выполнения JavaScript, предназначенная для работы на различных операционных системах, включая Microsoft Windows, Linux, Unix, macOS и другие. Node.js использует движок V8 для исполнения JavaScript-кода вне веб-браузера.
Общие сведения
| Node.js | |
|---|---|
| Тип | среда выполнения |
| Автор | Райан Дал |
| Разработчик | OpenJS Foundation |
| Написана на | JavaScript, C++, Python, C |
| Операционные системы | z/OS, Linux, macOS, Microsoft Windows, SmartOS, FreeBSD, OpenBSD, IBM AIX |
| Первый выпуск | 27 мая 2009 |
| Последняя версия |
|
| Репозиторий | github.com/nodejs/node |
| Лицензия | MIT License |
| Сайт | nodejs.org (англ.) |
Описание
Node.js позволяет разработчикам создавать консольные инструменты и серверные приложения с помощью JavaScript. Возможность выполнять JavaScript на сервере используется, в частности, для формирования динамического содержимого веб-страниц до их отправки пользователю. Благодаря этому Node.js реализует парадигму «JavaScript везде»[2], объединяя клиентскую и серверную разработку веб-приложений на одном языке программирования.
Node.js использует событийно-ориентированную архитектуру и поддерживает асинхронный ввод/вывод. Такой подход обеспечивает высокую производительность и масштабируемость веб-приложений с большим количеством операций ввода-вывода, а также приложений реального времени (например, сервисов обмена сообщениями и браузерных игр)[3].
Проект Node.js ранее управлялся фондом Node.js Foundation[4], который в дальнейшем объединился с JS Foundation в OpenJS Foundation. OpenJS Foundation курируется программой Collaborative Projects Фонда Linux[5].
История
Node.js был разработан Райаном Далом в 2009 году[6], примерно через 13 лет после появления первой серверной среды JavaScript — Netscape LiveWire Pro Web[7]. Первая версия поддерживала только Linux и Mac OS X. Позже ведущим спонсором развития выступила компания Joyent[8].
Дал критиковал ограниченную способность Apache HTTP Server обрабатывать десятки тысяч одновременных соединений, а также традиционную парадигму последовательного программирования, при которой приложения могут блокировать процессы или создавать множество стэков выполнения[9].
Node.js был публично представлен Далом на первой европейской конференции JSConf 8 ноября 2009 года[10][11]. Проект объединил движок Google V8, событийный цикл и низкоуровневый API для ввода-вывода[12].
В январе 2010 года был представлен npm — менеджер пакетов для Node.js[13]. npm позволяет публиковать и распространять модули Node.js вместе с исходным кодом, а также упрощает установку, обновление и удаление пакетов[12].
В июне 2011 года Microsoft и Joyent реализовали нативную поддержку Node.js для Windows[14]. Первая сборка с поддержкой Windows вышла в июле 2011 года.
В январе 2012 года Дал передал руководство проектом Айзеку Шлютеру, создателю npm[15]. В январе 2014 года Шлютер сообщил, что новым руководителем станет Тимоти Джей Фонтейн[16].
В декабре 2014 года Фёдор Индутный создал форк io.js, как альтернативу управлению Joyent, с открытой моделью управления проектом. Целью было обеспечить большую открытость и интеграцию последних версий движка V8[17].
Node.js Foundation был создан для объединения проектов Node.js и io.js — анонс состоялся в феврале 2015 года[18]. В сентябре 2015 года произошла фактическая интеграция: Node.js v0.12 и io.js v3.3 были объединены в Node.js v4.0[19]. Это слияние внедрило многие возможности ES6 и инициировало долгосрочный цикл поддержки (LTS)[20]. К 2016 году официальный сайт io.js рекомендовал использовать Node.js и объявил о прекращении развития форка[21].
В 2019 году JS Foundation и Node.js Foundation были объединены в OpenJS Foundation.
Брендинг
Обзор
Node.js позволяет создавать веб-серверы и сетевые инструменты на базе JavaScript и набора «модулей», реализующих базовые функции[10][12][24][25][26]. Среди встроенных модулей есть те, что отвечают за работу с файловой системой, сети (DNS, HTTP, TCP, TLS/SSL, UDP), обработку бинарных данных (буферы), криптографию, потоки данных и прочие функции[12][25].[27] API модулей Node.js упрощает создание серверных приложений[12][25].
JavaScript — единственный язык, поддерживаемый Node.js нативно, однако доступны различные языки, транслируемые в JavaScript[28]. Приложения Node.js могут быть написаны на CoffeeScript[29], Dart, TypeScript, ClojureScript и других языках.
Node.js широко используется для создания сетевых приложений, таких как веб-серверы[24]. Ключевое отличие от PHP состоит в том, что большинство функций в PHP блокирующие (команды выполняются строго последовательно), тогда как Node.js реализует неблокирующие (асинхронные) функции с использованием обратных вызовов[24].
Официальная поддержка реализована для Linux, macOS и Microsoft Windows начиная с версий 8.1 и Server 2012[30], c расширенной поддержкой SmartOS и IBM AIX, экспериментальной — для FreeBSD. OpenBSD также работает, а для IBM i (AS/400) доступны LTS-версии[31]. Исходный код можно собрать и под другие совместимые ОС, например NonStop OS[32] и некоторые UNIX-серверы.
Архитектура платформы
Node.js позволяет разрабатывать быстрые веб-серверы на JavaScript с использованием событийно-ориентированного программирования[12]. Разработчики могут строить масштабируемые серверы без явного использования потоков, применяя модель с колбэками для сигнализации о завершении задач[12]. Node.js сочетает простоту скриптового языка с возможностями сетевого программирования UNIX[12].
Node.js построен на основе движка Google V8, который распространяется под BSD-лицензией, и имеет встроенную поддержку базовых протоколов (HTTP, DNS, TCP). Популярность JavaScript облегчила освоение Node.js веб-разработчиками[10].
Поддержка в отрасли
Существует тысячи открытых библиотек для Node.js, большинство из них размещены на сайте npm. В сообществе проходят конференции и мероприятия: NodeConf, Node Interactive, Node Summit и локальные события по всему миру.
Открытым сообществом разработаны фреймворки для ускорения создания приложений, такие как Express.js, Socket.IO, Sails.js, Next.js, Meteor[12][33]. Также существуют решения для интеграции с другими языками и средами (например, Microsoft .NET)[34].
Современные IDE предоставляют специализированные средства для разработки и отладки приложений Node.js, включая Atom, Brackets, WebStorm (от JetBrains)[35][36] ,Microsoft Visual Studio (c Node.js Tools/[37] либо c поддержкой TypeScript[38][39][40]), NetBeans[41], Nodeclipse Enide Studio[42] (на основе Eclipse) и Visual Studio Code[43][44]. Также доступны облачные IDE, такие как Codeanywhere, Eclipse Che, Cloud9 IDE и визуальный редактор Node-RED.
Node.js поддерживается облачными платформами: Jelastic, Google Cloud Platform, AWS Elastic Beanstalk, Azure Web Apps, Joyent и др.
Выпуски
Новые основные релизы Node.js публикуются из основной ветки GitHub каждые полгода: чётные версии — в апреле, нечётные — в октябре. Когда выходит новая нечётная версия, предыдущая чётная получает статус долгосрочной поддержки (LTS) с 12 месяцами активной поддержки и еще 18 месяцами поддержки безопасности и исправлений критических ошибок[45]. Основные решения по выпускам принимаются рабочей группой LTS совместно с техническим комитетом Node.js Foundation.
| Версия | Статус | Кодовое имя | Дата выпуска | Окончание поддержки |
|---|---|---|---|---|
| 0.10.x | Снята с поддержки | 11 марта 2013 | 31 октября 2016 | |
| 0.12.x | Снята с поддержки | 6 февраля 2015 | 31 декабря 2016 | |
| 4.x | Снята с поддержки | Argon[45] | 8 сентября 2015 | 30 апреля 2018 |
| 5.x | Снята с поддержки | 29 октября 2015 | 30 июня 2016 | |
| 6.x | Снята с поддержки | Boron[45] | 26 апреля 2016 | 30 апреля 2019 |
| 7.x | Снята с поддержки | 25 октября 2016 | 30 июня 2017 | |
| 8.x | Снята с поддержки | Carbon[45] | 30 мая 2017 | 31 декабря 2019 |
| 9.x | Снята с поддержки | 1 октября 2017 | 30 июня 2018 | |
| 10.x | Снята с поддержки | Dubnium[45] | 24 апреля 2018 | 30 апреля 2021 |
| 11.x | Снята с поддержки | 23 октября 2018 | 1 июня 2019 | |
| 12.x | Снята с поддержки | Erbium[45] | 23 апреля 2019 | 30 апреля 2022 |
| 13.x | Снята с поддержки | 22 октября 2019 | 1 июня 2020 | |
| 14.x | Снята с поддержки | Fermium[45] | 21 апреля 2020 | 30 апреля 2023 |
| 15.x | Снята с поддержки | 20 октября 2020 | 1 июня 2021 | |
| 16.x | Снята с поддержки | Gallium[45] | 20 апреля 2021 | 11 сентября 2023[46] |
| 17.x | Снята с поддержки | 19 октября 2021 | 1 июня 2022 | |
| 18.x | Снята с поддержки | Hydrogen[45] | 19 апреля 2022 | 30 апреля 2025 |
| 19.x | Снята с поддержки | 18 октября 2022 | 1 июня 2023 | |
| 20.x | Поддержка (LTS) | Iron[47] | 18 апреля 2023 | 30 апреля 2026 |
| 21.x | Снята с поддержки | 17 октября 2023 | 1 июня 2024 | |
| 22.x | Активная поддержка (LTS) | Jod[45][47] | 24 апреля 2024 | 30 апреля 2027 |
| 23.x | Снята с поддержки | 15 октября 2024 | 1 июня 2025 | |
| 24.x | Текущая версия | Krypton[47] | 22 апреля 2025 | 30 апреля 2028 |
| 26.x | Запланировано | Lithium[47] | 2026 | 2029 |
| 28.x | Запланировано | Magnesium[47] | 2027 | 2030 |
| 30.x | Запланировано | Neon[47] | 2028 | 2031 |
| 32.x | Запланировано | Oxygen[47] | 2029 | 2032 |
| 34.x | Запланировано | Platinum[47] | 2030 | 2033 |
Технические особенности
Node.js — это среда выполнения JavaScript, обрабатывающая входящие запросы в цикле событий (event loop).
Внутреннее устройство
Внутри Node.js использует библиотеку libuv для асинхронных событий. Она абстрагирует сетевые и файловые операции как для Windows, так и для POSIX-совместимых систем (Linux, macOS, OSS для NonStop и др). Для поддержки HTTP используется nghttp2. С версии 20 добавлена библиотека ada (соответствие WHATWG/URL), с версии 19.5 — simdutf (ускоренная валидация и транскодирование Unicode), с версии 21.3 — simdjson (быстрый парсер JSON).
Многопоточность
Node.js реализует однопоточный событийный цикл, использующий неблокирующие I/O, что позволяет обслуживать десятки тысяч одновременных соединений без издержек на переключение контекстов потоков[48]. Для этой архитектуры задачи, требующие параллелизма, выполняются в пуле потоков библиотеки libuv[3].
Преимущество в высокой масштабируемости сочетается с ограничением на вертикальное масштабирование: без вспомогательных модулей (например, cluster[49], StrongLoop Process Manager[50] или pm2[51]) одна инстанция не может эффективно использовать несколько ядер процессора. При этом количество потоков в пуле libuv настраивается, а ОС распределяет их между ядрами[52]. Кроме того, ресурсоёмкие вычисления на CPU полностью блокируют событийный цикл до их завершения.
V8
V8 — движок исполнения JavaScript, первоначально созданный для Google Chrome и открытый Google в 2008 году. Написан на C++, компилирует исходный код JS в машинный код с помощью JIT-компиляции[3]. С 2016 года в V8 входит байткод-интерпретатор Ignition.
Управление пакетами
npm — предустановленный менеджер пакетов Node.js, отвечающий за установку, обновление и удаление сторонних модулей из центрального реестра npm.
Событийный цикл
Node.js регистрируется в ОС и получает уведомления о событиях (например, подключения к серверу). Каждое соединение в Node.js — это небольшой объект, связанный с памятью, а не отдельный процесс или поток. Для конкурентного ввода-вывода используется событийный цикл (event loop), а не процессы/потоки[53].
WebAssembly
Node.js поддерживает WebAssembly, а с версии 14 появилась экспериментальная реализация WASI (WebAssembly System Interface).
Нативные модули
Node.js поддерживает создание «аддонов» через API N-API на C/C++. Такие модули с расширением .node могут быть импортированы напрямую из JavaScript-приложения[54]. N-API требует использования инклуда специфических заголовков Node.js и V8. Из-за различий между версиями ядра Node.js существуют библиотеки-обёртки, упрощающие разработку, но за счёт повышения сложности поддержки.
Для сборки подобных модулей нужен совместимый компилятор (gcc, clang, MSVC++) и соответствующие заголовки (обычно поставляются с Node.js). По принципу N-API схож с Java Native Interface.
Управление проектом
В 2015 году различные ветви сообщества Node.js объединились в Node.js Foundation с открытой моделью управления. Целью организации является содействие широкому внедрению, ускорению развития и развитию долгосрочного сообщества вокруг ядра Node.js[55].
Технический комитет Node.js Foundation (TSC) управляет ключевыми репозиториями проекта и передаёт права отдельным рабочим группам (LTS, Web, Build и др)[56][57]. В августе 2017 года треть состава TSC ушла из-за конфликта по кодексу поведения[58].
| Учётная запись | Полное имя |
|---|---|
| aduh95 | Antoine du Hamel |
| anonrig | Yagiz Nizipli |
| benjamingr | Benjamin Gruenbaum |
| BridgeAR | Ruben Bridgewater |
| gireeshpunathil | Gireesh Punathil |
| jasnell | James M Snell |
| joyeecheung | Joyee Cheung |
| legendecas | Chengzhong Wu |
| marco-ippolito | Marco Ippolito |
| mcollina | Matteo Collina |
| mhdawson | Michael Dawson |
| RafaelGSS | Rafael Gonzaga |
| richardlau | Richard Lau |
| ronag | Robert Nagy |
| ruyadorno | Ruy Adorno |
| ShogunPanda | Paolo Insogna |
| targos | Michaël Zasso |
| tniessen | Tobias Nießen |
Примечания
- ↑ Release 24.6.0 — 2025.
- ↑ gcuomo JavaScript Everywhere and the Three Amigos (Into the wild BLUE yonder!) (англ.). www.ibm.com (24 октября 2013). Дата обращения: 8 июля 2022. Архивировано 14 ноября 2013 года.
- ↑ 1 2 3 Laurent Orsini. What You Need To Know About Node.js (англ.). readwrite.com (7 ноября 2013). Дата обращения: 6 февраля 2022. Архивировано 11 ноября 2013 года.
- ↑ Node.js Foundation - Node.js. nodejs.org. Дата обращения: 4 июля 2015. Архивировано 28 июля 2025 года.
- ↑ Linux Foundation Collaborative Projects. linuxfoundation.org (4 июля 2015). Дата обращения: 4 июля 2015.
- ↑ About Node.js, and why you should add Node.js to your skill set? Training.com (11 сентября 2016). Дата обращения: 23 октября 2016. Архивировано 1 апреля 2017 года.
- ↑ Staff, CNET News. Netscape opens intranet attack (англ.), CNET (15 October 1996). Архивировано 18 мая 2017 года. Дата обращения: 20 апреля 2017.
- ↑ Ryan Dahl. Joyent and Node. Google Groups (9 ноября 2010). Дата обращения: 5 февраля 2015.
- ↑ Garbar, Dzmitry PHP 7 vs Node.js? They Can Be Partners, Not Competitors For a Developer! belitsoft.com. Дата обращения: 21 декабря 2016. Архивировано 20 мая 2025 года.
- ↑ 1 2 3 Sams Teach Yourself Node.js in 24 Hours. — Sams Publishing, 2012-09-05.
- ↑ Ubl, Malte JSConf.eu 2009, Berlin, Germany. www.jsconf.eu (9 сентября 2009). Дата обращения: 9 сентября 2009. Архивировано 11 октября 2025 года.
- ↑ 1 2 3 4 5 6 7 8 9 Professional Node.js: Building JavaScript Based Scalable Software. — John Wiley & Sons, 2012-10-01.
- ↑ Earliest releases of npm. GitHub. Дата обращения: 27 июля 2016. Архивировано 2 октября 2025 года.
- ↑ Ryandahl Porting Node to Windows With Microsoft's Help. nodejs.org (23 июня 2011). Дата обращения: 17 апреля 2016. Архивировано 11 октября 2025 года.
- ↑ Dahl, Ryan New gatekeeper. Дата обращения: 26 октября 2013.
- ↑ Schlueter, Isaac The Next Phase of Node.js (15 января 2014). Дата обращения: 21 января 2014. Архивировано 11 октября 2025 года.
- ↑ Q&A: Why io.js decided to fork Node.js. InfoWorld Tech Watch. Архивировано 5 декабря 2014 года.
- ↑ Node.js Foundation Advances Community Collaboration, Announces New Members and Ratified Technical Governance. Дата обращения: 4 июля 2015. Архивировано 24 июня 2015 года.
- ↑ Node.js Foundation Combines Node.js and io.js Into Single Codebase in New Release. nodejs.org (14 сентября 2015). Дата обращения: 28 января 2016. Архивировано 14 октября 2015 года.
- ↑ io.js and Node.js merge. medium.com (19 мая 2015). Дата обращения: 27 июня 2015. Архивировано 11 октября 2025 года.
- ↑ Io.js, JavaScript I/O. Дата обращения: 1 сентября 2016. Архивировано 5 сентября 2015 года.
- ↑ Brand Guide. Node.js. OpenJS Foundation. Дата обращения: 22 марта 2024. Архивировано 12 октября 2025 года.
- ↑ Node.JS on X: "Meet Rocket Turtle there are many ways 👋". Дата обращения: 22 марта 2024. Архивировано 27 сентября 2024 года.
- ↑ 1 2 3 Node.js for PHP Developers. — O'Reilly Media, Inc., 2013.
- ↑ 1 2 3 Node.js Essentials. — Packt Publishing, 2015-11-10.
- ↑ Smashing Node.js: JavaScript Everywhere. — John Wiley & Sons, 2012-08-14.
- ↑ Модули. Nodejs.org. Архивировано 10 октября 2025 года.
- ↑ List of languages that compile to JS. GitHub. Архивировано 5 октября 2025 года.
- ↑ CoffeeScript on Node.js. — O'Reilly Media, Inc., 2013-04-15. — ISBN 9781449316846.
- ↑ nodejs/node. GitHub (13 апреля 2022). Архивировано 28 апреля 2022 года.
- ↑ Foundation, Node js Installing Node.js via package manager (англ.). Node.js. Дата обращения: 19 мая 2019. Архивировано 10 октября 2025 года.
- ↑ bomBora - Node.js for NonStop. infrasoft.com.au. Infrasoft. Дата обращения: 14 августа 2015. Архивировано 11 марта 2018 года.
- ↑ Azat Mardan. Express.js Guide: The Comprehensive Book on Express.js. — 2014-05-28.
- ↑ Tony Patton. Edge.js bridges the gap between Node.js and .NET. TechRepublic (1 июля 2014). Архивировано 14 июля 2014 года.
- ↑ Node.js. WebStorm Help. Архивировано 20 сентября 2015 года.
- ↑ Running and Debugging Node.js. WebStorm Help. Архивировано 31 мая 2015 года.
- ↑ Node.js Tools for Visual Studio. microsoft.com. Дата обращения: 1 февраля 2016. Архивировано 5 сентября 2015 года.
- ↑ typescript-node-definitions. GitHub. Архивировано 17 июня 2016 года.
- ↑ DefinitelyTyped. GitHub. Архивировано 9 октября 2025 года.
- ↑ The repository for high quality TypeScript type definitions. definitelytyped.org. Архивировано 3 февраля 2016 года.
- ↑ Krill, Paul Node.js takes center stage in NetBeans 8.1. infoworld.com. InfoWorld (10 ноября 2015). Дата обращения: 10 ноября 2015. Архивировано 13 ноября 2015 года.
- ↑ Nodeclipse, Enide -- Node.JS development in Eclipse. Nodeclipse Website. Архивировано 8 мая 2012 года.
- ↑ Hello Visual Studio Code (with NodeJS). Channel 9. Архивировано 20 сентября 2015 года.
- ↑ Node.js Applications with VS Code. Visual Studio Code. Архивировано 5 сентября 2015 года.
- ↑ 1 2 3 4 5 6 7 8 9 10 nodejs/Release (англ.). GitHub. Дата обращения: 3 мая 2018. Архивировано 11 октября 2025 года.
- ↑ Bringing forward the End-of-Life Date for Node.js 16. Node.js. Архивировано 25 сентября 2025 года.
- ↑ 1 2 3 4 5 6 7 8 Node.JS CODENAMES.md (англ.). GitHub. Дата обращения: 6 сентября 2023. Архивировано 25 сентября 2025 года.
- ↑ Node.js w/1M concurrent connections! caustik's blog (19 августа 2012). Архивировано 11 октября 2025 года.
- ↑ Модуль cluster в Node.js. nodejs.org. Дата обращения: 19 октября 2017. Архивировано 7 октября 2025 года.
- ↑ StrongLoop Process Manager. strong-pm.io.
- ↑ Unitech/pm2: Production process manager for Node.js applications with a built-in load balancer. GitHub (12 июня 2021). Архивировано 4 октября 2025 года.
- ↑ Aleksander Kasiuk. On problems with threads in node.js - Future Processing (22 апреля 2015). Архивировано 24 апреля 2015 года.
- ↑ About Node.js. Node.js. Архивировано 24 августа 2025 года.
- ↑ C++ addons. nodejs.org. Дата обращения: 26 сентября 2020. Архивировано 12 октября 2025 года.
- ↑ Foundation, Node.js Node.js Foundation (англ.). nodejs.org. Дата обращения: 8 марта 2017. Архивировано 11 октября 2025 года.
- ↑ nodejs/TSC (англ.). GitHub. Дата обращения: 8 марта 2017. Архивировано 29 августа 2025 года.
- ↑ Foundation, Node.js Working Groups (англ.). nodejs.org. Дата обращения: 8 марта 2017. Архивировано 27 февраля 2017 года.
- ↑ Whittaker, Zack. After governance breakdown, Node.js leaders fight for its survival, ZDNet (25 августа 2017). Архивировано 11 октября 2025 года.
- ↑ tsc-voting-members. Github.com (16 мая 2024). Архивировано 28 сентября 2025 года.