Как устроен React (на примере статьи про эпидемию)

Это как JavaScript, только интереснее.

Как устроен React (на примере статьи про эпидемию)

Недавно у нас вышел перевод статьи про распространение эпидемий. Там интересно: среди обычного текста выводятся интерактивные виджеты с симуляциями. И если посмотреть под капот, мы увидим, что эти симуляции сделаны очень элегантно и понятно. Например, вот небольшой фрагмент про излечение людей:

<div>
  <h3>Излечение</h3>
</div>
<div>
  Люди со временем излечиваются. Предположим, через два шага симуляции (то есть через два дня) люди поправляются:
</div>
<Figure>
  <Grid 
    daysIncubating={0} 
    daysSymptomatic={2} 
    gridRows={9} 
    gridCols={9} 
    nodeSize={30} 
    nug={1} 
    randomSeed={100}
    personHours={4} 
    showInteractions={false}
    speed={0.4} 
    transmissionProbability={1}
    travelRadius={1}
  />
</Figure>

Видно, что обычный текст с заголовком сделан как в HTML, а интерактивный виджет сделан каким-то очень понятным, элегантным кодом. Давайте посмотрим, что это за код.

Это React.js

Главное блюдо этого проекта — система React.js. Это библиотека для создания пользовательских интерфейсов и работы со страницей.

В нашем проекте React нужен для трёх вещей:

  • По-разному выделять в тексте статьи заражённых, больных и излечившихся.
  • Работать со слайдерами и симуляцией.
  • Встраивать симуляцию прямо в текст статьи.

В React параллельно происходят два процесса. С одной стороны, разработчик подробно описывает элементы интерфейса: какой должна быть кнопка или пункт меню; как они должны себя вести; как выглядеть. Эти описания упаковываются в «компоненты» — такие модульные кубики, из которых можно собирать интерфейс. Кубик может быть стандартным и авторским, сложным и простым. Можно заимствовать чужие кубики. Можно вкладывать кубик в кубик и делать мегакубики.

С другой стороны, разработчик использует простые команды в самом коде программы, чтобы рассказать, где какие кубики использовать.

Сила React

Сила React в том, что в нём есть два мира — «Что где стоит» и «Что как работает». И эти миры достаточно хорошо разделены, чтобы не ломаться, если что-то где-то изменилось.

Для сравнения. Если у тебя обычный HTML и тебе нужно поставить ссылку, ты говоришь такое заклинание:

<a href=”адрес_ссылки” target=”где_откроется” class=”как_выглядит”>текст ссылки</a>

В этом описании одновременно и «где ссылка», и «как она работает». Если мне нужно 30 таких ссылок на странице, мне нужно будет повторить этот код 30 раз. Каждый раз, когда я использую этот код, я с нуля говорю браузеру: «Так, мы с тобой сейчас будем делать ссылку, давай я тебе расскажу, как она будет работать».

А что если у меня в интерфейсе нужно что-то более сложное, чем ссылка? Какое-нибудь интерактивное поле, и таких полей нужно 15, и они должны общаться между собой? Тогда описывать каждое из них с нуля и как в первый раз — очень громоздко и затратно. А если потом нужно что-то изменить, то проще всё переписать с нуля.

Вот тут и нужен React. Мы отдельно описываем поведение каждого элемента, отдельно расставляем их и связываем.

Как устроена интерактивная часть статьи

Основная часть статьи — это просто HTML-код, который залит внутрь React-приложения. Иногда внутри этого текста встречаются вот такие заклинания:

<Figure>
  <Grid 
    daysIncubating={0}
    daysSymptomatic={2}
    gridRows={9}
    gridCols={9}
    nodeSize={30}
    nug={1}
    randomSeed={100}
    personHours={4}
    showInteractions={false}
    speed={0.4}
    transmissionProbability={1}
    travelRadius={1}
  />
</Figure>

Перед нами — вызов компонентов Figure и Grid. За них отвечают файлы Grid.js и Figure.js — в них описаны правила, как именно браузеру следует использовать эти параметры, чтобы нарисовать анимацию и подписи к ней.

Параметры каждой симуляции мы указываем прямо в тексте статьи. Когда React работает, он забирает эти параметры из статьи, передаёт в компонент, компонент обрабатывает эти параметры и возвращает в статью готовый интерактивный виджет с симуляцией заражения.

Что это нам даёт:

  • Сложная логика движка симуляций прописана где-то в отдельном месте, её не нужно дублировать. Если мы захотим поменять общий принцип работы симулятора, мы это сделаем в файлах Grid.js и Figure.js, не сломав саму статью.
  • Внутри статьи мы прописываем только существенные изменения в поведении симуляции: например, какого размера будет симуляция, с какой скоростью будет протекать, как люди будут заражаться.
  • Нам очень легко добавлять в статью новые симуляции с любыми параметрами.
  • Код получается элегантным и простым, хотя само приложение довольно сложное.

Где ещё используется React

Статья Кевина Симлера о пандемии — лишь малая часть демонстрации того, что умеет React.js. На самом деле эту библиотеку используют для проектов разного уровня, от частных, как у нас, до глобальных, как у этих ребят:

  • новостная лента в Facebook (собственно, Facebook и разработал саму библиотеку React.js);
  • почти весь видимый пользователю Instagram;
  • часть интерфейсов в WhatsApp;
  • Netflix;
  • сайт New York Times;
  • Yahoo! Mail;
  • Dropbox;
  • сотни других удобных интерфейсов, которые делают программисты по всему миру.

С чего начать

Если вам понравилось, как можно работать с веб-страницами, начните с этих материалов:

Обложка:

Даня Берковский

Корректор:

Ирина Михеева

Вёрстка:

Маша Климентьева

Вам может быть интересно
Как работают блокировщики рекламы в браузерах
Как работают блокировщики рекламы в браузерах

Разбираемся со списками фильтрации, запросами и тем, как сайты могут сами бороться с блокировщиками

easy
Роман Халкечев, руководитель отдела аналитики в Яндекс.Еде и Лавке
Роман Халкечев, руководитель отдела аналитики в Яндекс.Еде и Лавке

Часть 2: о Яндекс.Еде и Лавке, аналитических задачах и оптимизации бизнеса на основе данных.

easy
Исполняющие среды WebAssembly
Исполняющие среды WebAssembly

Что это, как устроено и кому надо

medium
«Я не успеваю писать код, но участвую во всех важных обсуждениях». Как работает руководитель разработки Яндекс.Практикума
«Я не успеваю писать код, но участвую во всех важных обсуждениях». Как работает руководитель разработки Яндекс.Практикума

От первого сайта за 300$ до руководителя в Яндексе.

Ремонт Apple изнутри: что происходит за кулисами в мастерских
Ремонт Apple изнутри: что происходит за кулисами в мастерских

О работе Apple, сервисе, гарантии, деталях и удалённой блокировке устройств

easy
Как работает поиск Яндекса: «Нога Акинфеева обои» и ещё сто миллионов запросов в день
Как работает поиск Яндекса: «Нога Акинфеева обои» и ещё сто миллионов запросов в день

Подкаст о главном ИТ-продукте рунета

easy
hard