The State of Reactive in JS: практичний огляд FRP бібліотек

Стаття народилася з цієї відповіді на StackOverflow і переросла в цей блог пост (англійською), але я думаю вона не втратила актуальність.

Зараз дуже багато галасу навколо Reactive Programming. Я витратив якийсь час на вивчення цієї дисципліни застосовано до JavaScript і Node.js і склав свою думку про самі, на мій погляд, цікаві бібліотеки.

RxJS

Це свого роду еталон - поява Reactive Extensions для .net, в якомусь сенсі, створила цю дисципліну.

Pros:

  • Документація і велике ком'юніті (> 15000 зірочок на Github, > 3073 тегів на SO);
  • Це бібліотека з сімейства Rx *, а отже використовує той самий інтерфейс. Практично, це означає, що іноді можна дивитися приклади з RxJava і оригінально Reactive Extensions;
  • Є примітиви майже на всі випадки життя;
  • Є backpressure (ось тут можна прочитати що це);
  • по цій бібліотеці є одна книга.

Cons:

  • Іноді виглядає як «матан». Документації нагадують безодню - не зрозуміло, як це все «на голову натягнути»?
  • Реалізовано хлопцями з Java'ою в голові (любов до великої кількості абстракцій, ідіоматика з Java/.Net, іноді дивні сигнатури). Це не те щоб погано, просто деякі речі виглядають в JS дивними (приклад Scheduler - я так і не зрозумів навіщо це все потрібно в single-thread середовищі). Звідси ж бажання писати на TypeScript'e

Bacon.js

Колись модна бібліотека для хіпстерів - зараз всі забули

Pros

  • Гарна документація і хороші приклади від ком'юніті (наприклад, гра Змійка);
  • Реалізовано майже всі примітиви з Rx *;
  • Реалізовували в першу дуже для JS і JSсним бекграундом;
  • ІМХЗ, дуже легко почати просто пройшовшись за прикладами та документацією.

Cons

  • Немає Backpressure - давайте просто забудемо про backend розробку

Highland.js

Бібліотека від caolan - автора async

Pros:

  • Відразу писалося для JS/Node.js хлопцями які на них писали щось велике і люблять мову/платформу - а значить JS-ная ідіоматика і Node.js в голові (див. наступний пункт);
  • Побудовано поверх Node.js Stream, це забезпечило бібліотеці маленький розмір. Крім того, суб'єктивно, так набагато легше про це все думати: у нас є stream A, ми з ним щось робимо і pipe'аєм його в stream B (ось моя стаття, з прикладом);
  • backpressure - Причому наскільки я розумію нічого не потрібно було писати руками, все вже є в Node.js Stream.

Cons:

  • Слабка документаціяуже краща і відсутня прикладів. За прикладами прийдеться лізти в Rx або Bacon - змиріться з цим;
  • Відсутність багатьох примітивів. Не те щоб їх складно реалізувати руками, але все ж. приклад .interval і .combceLatest;
  • Дуже суб'єктивно: Флегматичне коммьюніти - самі пишуть, самі кайфують, експансії не ведуть.

Замість підсумку

Через відстутність осудних прикладів вам прийдеться подивитися всі ці бібліотеки, Rx * так точно. ІМХО, найправильніша Highland - люди, які її писали, розуміють ідіоматику платформи і люблять її. Найбільш «зріла» RxJS - її ще в Angular «впиляли», hype-гарантований.

Підказка: Якщо вам потрібно щось запитати на StackOverflow - перекладіть відразу RxJS- «діалект», так з більшою ймовірністю дадуть відповідь.