Будучи самым популярным языком программирования, JavaScript также является одной из самых универсальных технологий разработки ПО, позволяя создавать качественные приложения для множества платформ, таких как Apache Cordova, React Native, NativeScript, Appcelerator Titanium и другие.
Но на этом области применения JS не заканчиваются. В последнее время этот язык часто рассматривается в качестве главного претендента для программирования на стороне сервера. И обозначило этот сдвиг в индустрии веб-разработки появление Node.js.
Что такое Node.js? История создания и развития
На самом деле Node.js — это не фреймворк или библиотека, а среда выполнения, которая базируется на движке Chrome V8 JavaScript.
Технология была впервые представлена в 2009 году Райаном Далем на ежегодном европейском форуме JSConf и сразу же была признана самой значимой частью программного обеспечения в современной вселенной JavaScript.
Как проект с открытым исходным кодом Node.js спонсировался Joyent — крупным поставщиком решений для облачных вычислений и хостинга. Ранее компания уже инвестировала в ряд других технологий, таких как инфраструктура Ruby on Rails, а также предоставляла услуги хостинга для таких гигантов, как Twitter и LinkedIn. Последний также стал одним из первых сервисов, использовавших Node.js для программирования бэкэнда своего мобильного приложения. Позже технология была принята рядом технологических лидеров, таких как Uber, eBay, Walmart и Netflix. И этот список можно продолжать до бесконечности.
Сильные и слабые стороны Node.js остаются предметом жарких дискуссий. Чтобы внести ясность, стоит проанализировать как плюсы, так и минусы этой среды.
Преимущества использования Node.js
Согласно данным Google Trends, интерес к этому ответвлению JS достиг пика в 2017 году и остаётся высоким. И на то есть веские причины.
Надёжная технология на базе JavaScript
Используя Node.js в качестве основы для бэкэнда, вы автоматически получаете все преимущества полнофункциональной разработки на JavaScript, в числе которых:
оптимальная скорость работы приложений;
возможность совместного и повторного использования;
огромное количество бесплатных инструментов;
кроссплатформенность.
Всё это позволяет сделать процесс разработки максимально гибким и менее затратным по времени. Как результат, вы в кратчайшие сроки получаете качественное и надёжное программное обеспечение. Разработчики, специализирующиеся на JavaScript, могут начать программировать серверную часть с минимальными усилиями, упаковывая существующий код в модули и создавая новые уровни абстракции.
Быстрая обработка запросов и эффективная событийная модель
Node.js работает быстро. Это доказывают результаты тестов производительности, представленные toptal.com. Исследователи сравнили, как популярные языки, такие как GO, PHP, Java и Node.js, обрабатывают одновременные запросы.
Последний демонстрирует лучшие результаты практически по всем показателям благодаря использованию движка V8. Изначально он был разработан для браузера Chrome. Написанный на C++, Chrome V8 используется для компиляции функций, написанных на JS, в машинный код, и выполняет эту работу с впечатляющей скоростью. Благодаря тому, что Google вкладывает большие средства в свой движок, V8 на протяжении многих лет демонстрировал рост производительности, а Node.js извлёк из этого все возможные преимущества.
Ещё одним немаловажным преимуществом является асинхронная обработка запросов. В контексте серверной части синхронная обработка предполагает, что код выполняется последовательно. Таким образом, каждый новый запрос блокирует поток остальных, а другие команды начнут выполняться только после того, как будет выполнена предыдущая. В свою очередь, асинхронный метод, который используется в Node.js, максимально используя однопоточную обработку, что сокращает время отклика в несколько раз.
Третий аспект — это событийная модель. При использовании одного языка как на стороне клиента, так и в бэкенде, синхронизация происходит максимально быстро, что особенно полезно для приложений реального времени, основанных на событиях. Благодаря своей асинхронной однопоточной природе Node.js идеально подходит для онлайн-игр, чатов, видеоконференций или любых других проектов, требующих постоянного обновления данных.
Примеры говорят сами за себя: многие ведущие компании после перехода на Node.js заметили значительные улучшения — PayPal, например, сообщил о снижении времени отклика на 35% после миграции с Java.
Идеальный выбор для микросервисной архитектуры
Будучи простой и лёгкой средой программирования, Node.js стал идеальным решением для так называемой архитектуры микросервисов. Этот подход предполагает разработку одного приложения как набора небольших сервисов, каждый из которых работает с собственными процессами и взаимодействует с легковесными механизмами, часто с API ресурсов HTTP.
Согласно отчёту Node.js User Survey Report 2017, Node.js является предпочтительной технологией при создании решений на базе подобных экосистем. Около половины респондентов используют технологии, связанные с микросервисами (если точнее, то речь идёт о Docker — ведущей платформе для контейнеризации программного обеспечения).
Поскольку каждый микросервис обменивается данными с базой данных напрямую, такая архитектура позволяет повысить производительность и скорость работы приложения.
В качестве примера реализации можно рассмотреть переход Walmart к микросервисной архитектуре на базе Node.js. Такое решение позволило компании получить немало преимуществ:
За ночь рост конверсии на 20% в целом и рост конверсии с мобильных устройств на 98%.
100% время безотказной работы в Чёрную пятницу (более 500 млн просмотров страниц).
Экономия до 40% на оборудовании.
Ещё один яркий пример того, как Node.js может превзойти конкурентов с точки зрения производительности, — это GoDaddy. Запустив рекламную кампанию SuperBowl, компания смогла обработать 10 000 запросов в секунду без простоев, используя только 10% возможностей оборудования.
Богатая экосистема
NPM — менеджер пакетов Node.js по умолчанию — также служит основной платформой для инструментов JavaScript с открытым исходным кодом, которые играют важную роль в развитии этого языка программирования. С учётом того, что на данный момент в реестре npm доступно около миллиона библиотек и еженедельно публикуется более 10 000 новых, экосистема Node.js довольно богата. Согласно данным статистики, 97% современных веб-приложений состоят из модулей npm. И это доказательство его неоспоримой популярности среди разработчиков.
С таким огромным разнообразием бесплатных инструментов, доступных в несколько кликов, существует огромный потенциал для использования Node.js. В то же время ПО с открытым исходным кодом пользуется всё большей популярностью, поскольку оно позволяет создавать новые решения, сокращая общие затраты на разработку и сроки выхода на рынок.
Поддержка IT-гигантов
Как упоминалось выше, разработку Node.js поддержала Joyent. В 2015 году был создан фонд, призванный обеспечить широкое распространение и ускорить развитие этой среды. IBM, Microsoft, PayPal, Fidelity и SAP стали членами-основателями этой организации.
Список компаний, использующих Node.js, постоянно растёт. В настоящее время в него входят более 300 известных компаний, таких как PayPal, Medium, Trello, Uber, Zendesk и множество других.
Очень немногие проекты с открытым исходным кодом когда-либо пользовались такой сильной поддержкой со стороны ведущих мировых корпораций. И это говорит о выдающемся потенциале Node.js.
Полная поддержка JSON
Хотя другие серверные технологии, такие как PHP и Ruby on Rails, могут использовать JSON для связи, Node.js делает это без преобразования между двоичными моделями посредством JavaScript. Это особенно удобно, когда вам нужно создать RESTful API для поддержки базы данных NoSQL. Эта «бесшовная» связь с одним из основных стандартов передачи данных — ещё одно преимущество экосистемы JavaScript.
Ложка дёгтя: почему Node.js может вам не подойти
Несмотря на впечатляющий потенциал проекта, рассматривая возможность использования Node.js для программирования серверной части, стоит учесть и некоторые его существенные недостатки.
Низкая производительность при работе с тяжёлыми вычислительными задачами
Самым большим недостатком Node.js даже сейчас является его неспособность обрабатывать тяжёлые задачи, связанные с процессором. Но, чтобы понять, каковы корни этой проблемы, необходимо немного углубиться в теорию.
Как известно, Node.js - это среда выполнения, которая выполняет JavaScript на стороне сервера. Будучи языком программирования внешнего интерфейса, JS использует один поток для быстрой обработки задач. Для его работы не требуется многопоточность, потому что задачи в JavaScript легковесны не потребляют большое количество ресурсов процессора.
Неблокирующая модель ввода и вывода означает, что Node.js отвечает на вызов клиента, чтобы начать выполнять запрос, и обрабатывает задачу во время выполнения обратного вызова. То есть, Node асинхронно выполняет JS-код в своём единственном потоке на основе событий. Это называется циклом событий.
Проблема возникает, когда Node.js получает задачу, привязанную к ЦП: всякий раз, когда в цикл событий приходит тяжёлый запрос, Node.js направляет все доступные ресурсы ЦП для его первой обработки, а затем отвечает на другие запросы в очереди. Это приводит к общей задержке в цикле событий, поэтому Node.js не рекомендуется для тяжёлых вычислений.
В 2018 году многопоточность была представлена в качестве экспериментальной функции Node.js версии 10.5.0. Так называемый модуль рабочих потоков может задействовать дополнительные потоки, но только на процессорах с несколькими ядрами. Хотя за последние несколько лет эта функция значительно усовершенствовалась, в обработке тяжёлых задач решение по-прежнему уступает альтернативам.
Зависимость от обратного вызова
Из-за своей асинхронной природы Node.js в значительной степени полагается на обратные вызовы — функции, которые запускаются после завершения каждой задачи в очереди. Сохранение ряда задач в очереди может значительно усложнить программу, затруднив понимание кода.
Незрелость
Хотя основные модули Node.js довольно стабильны и могут считаться зрелыми, в реестре npm есть много инструментов, которые либо имеют низкое качество, либо не имеют чёткой документации и не были протестированы должным образом. Более того, сам реестр недостаточно хорошо структурирован, чтобы предлагать инструменты на основе их рейтинга или качества. Следовательно, может быть трудно найти лучшее решение для ваших целей, не зная, что искать.
Сравнение Node.js с Ruby on Rails и Django
Существует не так много технологий, которые могли бы конкурировать с Node.js по популярности. Однако, если взглянуть на существующие альтернативы в сфере серверного программирования, можно увидеть ещё как минимум два «звёздных» кандидата. Это Ruby on Rails и Django.
Ruby on Rails известен простотой и наличием собственной экосистемы пользовательских пакетов Rails. Сам Ruby — интуитивно понятный и удобный для новичков язык с мощной поддержкой сообщества в RubyGems. Rails был создан для быстрой разработки и создания прототипов, хотя он успешно используется такими брендами, как GitHub, Twitter и Airbnb, что доказывает его универсальность. Особенно впечатляют его возможности для управления базами данных — в отличие от Node.js, в котором используются дополнительные пакеты, в Rails необходимые функции встроены изначально.
Хотя Rails не может конкурировать с производительностью и масштабируемостью Node, этот язык может быть лучшим выбором для быстрой разработки.
Ещё один популярный веб-фреймворк, который может использоваться для программирования бэкэнда — Django. Позиционируемый как инструмент для перфекционистов, он создан, чтобы делать приложения максимально быстрыми, структурированными, безопасными и лёгкими для понимания. По сравнению с Node.js, Django гораздо более удобен для новичков. Однако других весомых преимуществ у него нет. Скорее, это зависит от личных предпочтений разработчика и опыта работы с JavaScript или Python.
Web