Node.js глазами Ruby-разработчика. Первое впечатление

Node.js pros and cons

Введение

Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js' package ecosystem, npm, is the largest ecosystem of open source libraries in the world.

Именно это написано на официальном сайте Node.js, и именно с этого наша команда Ruby-разработчиков начала изучение Node. В работе над проектом мы придерживаемся микросервисной архитектуры, и у нас уже много маленьких web-приложений, реализованных на Rails/Sinatra. В какой-то момент мы приняли решение поэкспериментировать с Node и дружно принялись изучать его. Дальше я попытаюсь поделиться первыми впечатлениями об этой платформе после месяца работы с ней.

Первый вопрос, которым мы задались: "а что же такое Node?". Это не реализация языка (JavaScript), не библиотека, не framework и не web-сервер. Можно найти такие определения, как environment и runtime. На каком-то форуме встретилось следующее краткое определение - это event-loop c библиотеками. Не особо проясняет суть вопроса, правда?

Мы не хотели работать с Node как с черным ящиком, поэтому немного углубились в его исходный код, реализации его стандартной библиотеки и библиотеки libuv, где собственно и воплощены все примитивы асинхронности и не блокирующих вычислений. Это многое объяснило и стало понятно не только как работать с Node, но и в чём его преимущества и недостатки.

Далее мы стали изучать прикладные библиотеки и инструменты, аналогичные тем, что мы привыкли использовать в стеке Ruby/Rails. Нас не интересовали проекты-клоны Rails вроде Nodal или Sails. На первый взгляд, по возможностям они не доросли до Rails и недалеко ушли от framework'ов а-ля Sinatra. Мы пробовали разные ORM, библиотеки для модульного и интеграционного тестирования, конфигурации приложения и много-много другого.

Выяснилось, что нет какого-то основного web-framework'a, на совершенствование или развитие которого бы сконцентрировало внимание сообщество. Де-факто есть только один вменяемый framework - Express.js. Это хороший, продуманный и мощный инструмент, но он позиционирует себя как микро-framework и даёт только часть возможностей - routing и middleware. Нет какого-то основного ORM. Есть минимум три популярных и множество недоделанных или уже заброшенных проектов. Оказалось, что для модульного тестирования наличествуют как минимум 4-5 популярных библиотек и примерно столько же для интеграционного, никак не связанных между собой. Чтобы сделать осознанный выбор библиотеки или инструмента, нам придётся пощупать каждый из них на отдельных небольших demo-проектах.

Node буквально заставляет писать асинхронный код. Это может сильно его усложнить и ухудшить читабельность. При переписывании маленького проекта с Ruby/Sinatra на Node объём тестов вырос в несколько раз.

Если вы пишете на Node - вы пишете на JavaScript. Да, есть альтернативы - CoffeScript/ClojureScript/любая другая экзотика, etc., но в 99% вы пишете на JavaScript. Конечно, вы хотите использовать самые последние возможности самых последних стандартов ES6 и ES7. К сожалению, Node не успевает включать поддержку постоянно добавляемых в V8 возможностей, поэтому единственная возможность получить всё уже сейчас - это использование транспайлеров, таких как babel, которые будут транслировать ваш ES6/ES7 JavaScript-код в то, что Node понимает и поддерживает. И здесь вас поджидают трудности: как запускать тесты, как запускать приложение локально и на production'е, как настроить инструменты для анализа кода, test coverage…

Плюсы и минусы Node.js

После месяца знакомства с Node, мы можем выделить следующие плюсы и минусы:

Плюсы

  • Node даёт вам все плюсы asynchronous non-blocking кода, такие как: web-сервер экономнее расходует ресурсы и может поддерживать больше параллельных клиентских соединений для определённого типа приложений, где активно выполняются операции ввода/вывода (I/O). Реализация, как минимум, не хуже альтернатив на других платформах (Ruby/Java/Python);
  • Вы используете JavaScript, более-менее знакомый любому web-разработчику;
  • Некоторые библиотеки копируют аналоги из Ruby/Rails стека, поэтому с ними изначально комфортно работать;
  • Библиотек/инструментов много, они активно развиваются.

Минусы

  • Нет основных библиотек/инструментов - у каждого есть множество альтернатив, плюсы/минусы которых не ясны из документации, приходится лично пробовать и выбирать. Очень много заброшенных проектов. Для многих стандартных задач нет какого-то готового и законченного решения, есть только поделки;
  • Очень слабая интеграция между инструментами. Приходится при необходимости писать обвертки руками;
  • Инструменты ещё не достигли той зрелости, что мы видим в стеке Ruby/Rails, они активно развиваются, но пока не достаточно функциональны для привычного Ruby-сту уровня комфорта;
  • Опять JavaScript. Это не самый удачный язык и последние изменения в стандартах не очень спасают. Чтобы получить последние стандартизированные возможности, нужно добавлять транспайлер по типу babel.

Что в итоге?

Для обычного web-приложения, где активно работают с базой данных, подход Node.js обещает заметное повышение производительности. Это работает и в нашем случае, так как у нас делается много HTTP-запросов к внутренним и внешним сервисам.

Переход на Node у нас получается быстрым и плавным, порог вхождения оказался невысоким. Основные трудности пока были связаны с выбором библиотек, их изучением и сравнением между собой.

С другой стороны, после синхронного кода всё получается несколько сложнее. Насколько это критично, мы скоро увидим.

Зрелость экосистемы и готовность библиотек для серверной разработки пока удручает. Планируем тратить много сил на интеграцию разных инструментов между собой и на их доработку и совершенствование.

Связаться