Node.js — не идеальный продукт, у которого есть определенные недостатки (используя JS?). Некоторые из них являются результатом ошибочных решений на ранней стадии развития. Как это часто бывает, иногда трудно или невозможно найти альтернативу этой системе, особенно в корпоративном секторе. Но если вам не нужно поддерживать большой устаревший код, который обеспечит программистов работой на долгие годы, вы можете присмотреться к другим решениям.

ASP.NET

Старый друг лучше двух новых. ASP.NET имеет долгую историю. Технология Active Server Pages, которая легла в основу сервисов ASP.NET, была разработана в конце прошлого века. Конечно, продолжительность разработки не всегда является решающей, но долгий срок службы продукта говорит о многом. Хотя у ASP.NET совсем другой принцип работы, это не просто среда для запуска программного кода и подключения модулей, это платформа для создания веб-сервисов. Он часто используется для решения задач, подобных Node.js.

В то время как Node.js является детищем небольшой команды и в своей самой базовой форме представляет собой среду для запуска программ JS вне веб-браузера с доступом к вводу-выводу, ASP.NET — типичный продукт огромной корпорации. Он изначально содержит большое количество библиотек по умолчанию, которые сразу позволяют приступить к разработке. Node движет вперед сообщество разработчиков, а потому систему нужно предварительно оснастить всеми необходимыми модулями, которых великое множество. Самый простой «Hello world!» in Node принесет в систему несколько тысяч файлов. Тем более, что количество не всегда означает качество. Иногда кажется, что разработчики даже готовы запихнуть «i++» в отдельный модуль, который потом будет скачиваться миллион раз, и внезапное обновление или удаление этого пакета вызовет серьезные проблемы с совместимостью или сбой npm. В ASP безопасность и обновления контролируются экосистемой Microsoft. Библиотеки, написанные ею и другими крупными компаниями, тщательно проверяются на наличие ошибок и проблем совместимости.

Несмотря на множество отличий, одним из важнейших является иной подход к распределению вычислений. Node.js был однопоточным языком, который использовал асинхронный ввод-вывод, в то время как ASP был многопоточным и поддерживал синхронный ввод-вывод. Первый вариант показывает большую производительность при работе с сервисами, требующими очень интенсивного обмена, хотя ваш код становится более сложным. В последних версиях продуктов эти отличия менее заметны. В Node.js и ASP.NET используется шаблон async\await.

JS значительно вырос за время своего развития. Тем не менее, он остается слабо типизированным языком, уступающим C#, который изначально разрабатывался под непосредственным влиянием C++, всегда поддерживавшего строгую типизацию и ООП. В результате C# является более мощным и последовательным и не требует таких надстроек, как TS. Но с другой стороны, благодаря своей простоте JS становится все более популярным при программировании микросервисов, не требующих сложных возможностей C#.

Помимо различий в используемых языках программирования, у этих платформ разная идеология. В ASP.NET многие вещи предопределены и готовы к использованию, включая файловую структуру. Но когда вы начинаете работать с Node.js, вам приходится самостоятельно выбирать то, что вам нужно, что дает большую гибкость, но усложняет разработку. Однако в ASP.NET есть мощные средства отладки, тестирования и рефакторинга.

Единственное, в чем ASP.NET серьезно уступает Node.js, — это простота развертывания. Node нужен только движок и прокси или Docker. Платформу можно настроить как самостоятельно, так и взять готовый образ VPS, который доступен практически у любого хостинг-провайдера. Хоть ASP и кроссплатформенный, здесь все не так просто, и только пользователи Azure могут позволить себе готовые образы для настройки серверов.

Вам действительно нужен JavaScript?

Node.js был создан как среда выполнения для JS, поскольку это простой и доступный язык программирования, который упрощает параллельный запуск нескольких сценариев для двусторонней связи данных веб-приложений между браузером и сервером. ASP.NET также был создан для написания веб-приложений, но с использованием других методов. Например, Deno состоит из нескольких слоев над виртуальной машиной, которая напрямую работает с ресурсами сервера. Но не обязательно использовать сложные обертки тех языков программирования, которые не запускаются на сервере и требуют виртуальных машин.

Go

В 2007 году инженеры компании решили, что C++ не отвечает современным реалиям компьютерных технологий. Им нужны были эффективные средства распараллеливания, которые использовали бы возможности многоядерных процессоров и распределенных систем. Более того, понадобился автоматический сборщик мусора и некоторые упрощения для лучшей читабельности кода и простоты работы с типами.

Целью разработчиков было не создание «лучшей версии C++», а создание более понятного языка на основе их опыта программирования. Go был публично анонсирован в 2009 году и почти вошел в топ-10 языков программирования (13-е место в начале 2012 года). Даже Райан Даль сказал, что предпочел бы использовать Go вместо Node.js. Однако со временем язык был почти забыт, пока не выяснилось, что его средства распараллеливания хорошо подходят для разработки микросервисов в веб-приложениях. Это вернуло языку былую популярность.

Для Go было написано несколько веб-фреймворков, хотя вам не нужно их использовать, так как язык имеет все функции, которые необходимы для программирования веб-приложений. Deno изначально был написан на Go.

Рубин

В отличие от Go, этот язык не нов. Он был выпущен в 1995 году и разработан энтузиастом-одиночкой Юкихиро Мацумото, который стремился создать интерпретируемый объектно-ориентированный язык, который был бы лучше, чем Python. Язык не получил большой популярности, не в последнюю очередь потому, что первые пару лет его документация была только на японском языке. Книги на английском языке были опубликованы только в начале 2000-х годов, и этот язык привлек большое внимание с выпуском Ruby on Rails в 2005 году. Этот веб-фреймворк быстро стал популярным, особенно когда в 2007 году Apple объявила, что он будет включен в Mac OS. Х 10,5.

Как и во всех интерпретируемых языках, скорость Ruby была относительно низкой, что сильно сказывалось на производительности веб-приложений, написанных на Ruby on Rails. Автор знал об этой проблеме и начал разрабатывать языковую версию, которая потеряла бы обратную совместимость, но работала бы намного быстрее, что он и сделал в 2009 году. Скорость значительно возросла и сравнялась с веб-приложениями, поддерживающими .NET и JVM. Благодаря этому популярность фреймворка взлетела до небес. В 2018 году автор Ruby выпустил версию 2.6, в которой реализована динамическая компиляция и еще больше ускорена работа приложений.

До сих пор язык Ruby тесно связан с фреймворком Ruby on Rails.

Эликсир

Erlang — еще один язык программирования, созданный крупной корпорацией. На этот раз шведы из Ericsson постарались на славу. В 1986 году никто даже не думал о разработке веб-приложений, Интернет был только проектом, а язык создавался для запуска систем в реальном времени. Erlang долгое время оставался неизвестным за пределами компании, которая использовала его для своих внутренних нужд. В 1998 году руководство решило прекратить поддержку их языка и запретило его использование, обязав разработчиков перейти на Java. Это привело к тому, что язык был выпущен под открытой лицензией, и его начали распространять за пределами компании, разработавшей его. Сначала он представлял интерес только для небольшой группы ученых, пока не выяснилось, что его концепция хорошо подходит для разработки многопроцессорных архитектур.

В 2012 году Хосе Валиму, одному из разработчиков Ruby on Rails, пришла в голову идея создать язык программирования для высоконагруженных систем и крупных веб-сайтов. В результате был разработан Эликсир. Это функциональный язык программирования, скомпилированный в байт-код для виртуальной машины Erlang (BEAM). Поскольку в основе языка лежит Erlang, который разрабатывался для программирования коммуникационного оборудования, Elixir получил ряд уникальных свойств: отказоустойчивость, горячую замену кода (изменение или откат кода работающей программы без ее перезапуска) и возможность работать в режиме реального времени. Эти свойства позволяют создавать надежные высоконагруженные системы, поддерживающие как горизонтальное, так и вертикальное масштабирование и работающие в 5–10 раз быстрее, чем аналогичные приложения, написанные на интерпретируемых языках (PHP, Ruby, Python). Место работы создателя повлияло на то, что в языке использовался Ruby-подобный синтаксис. Вот почему его легко освоить тем, кто использует Ruby on Rails.

Эликсир в настоящее время используется такими известными компаниями, как Discord, Square Enix, PepsiCo и Sketch.

Но что, если мы используем JavaScript?

Но что делать, если осваивать новый язык программирования нецелесообразно, как и выводить на сервер всю Node? Вы можете взглянуть на другие среды выполнения JS.

RingoJS — многопоточная платформа, построенная на JVM и оптимизированная для серверных приложений. Код JS интерпретируется движком Mozilla Rhino, который имеет впечатляющую историю. Его начали разрабатывать в 1997 году, еще во времена Netscape. Позже проект был передан Mozilla Foundation и размещен в открытом доступе.

Приложения RingoJS можно развернуть на любой платформе Linux, вплоть до Raspberry Pi, или поверх облачных платформ, таких как Google App Engine. Модульная система RingoJS основана на CommonJS, и вы даже можете использовать некоторые модули Node.js. Также движок Ringo позволяет интегрировать библиотеки, написанные на Java.

PurpleJS — еще один простой JS-фреймворк, работающий на JVM. Nashorn (также Rhino), разработанный Oracle, используется в качестве JS-движка. Нельзя сказать, что это полноценная замена Node, так как фреймворк не использует асинхронный режим, а у Nashorn нет поддержки CommonJS, но он очень легковесный и не требует перезапуска сервиса после изменения кода.

Vert.x — это не фреймворк, а многоязычный набор инструментов, позволяющих создавать полностью асинхронные реактивные веб-приложения, а также микросервисы и сетевые утилиты, работающие на JVM. Поддерживаемые языки не ограничиваются Java и JS. Вы также можете писать приложения на Groovy, Ruby, Scala и Kotlin. Поддерживается модульная система с централизованным хранилищем. Vert.x можно легко расширять и масштабировать.

Забавно, что изначально проект назывался Node.x, потом его переименовали, чтобы избежать юридических проблем, так как цели при создании Vert.x были те же, что и у Node.js. Тим Фокс (создатель Vert.x) сказал, что его вдохновил успех Дали, и он хотел создать Node.js на JVM.