Статьи

Реакция выборки данных с помощью реле

React открывает новую эру в начале. Опубликованная Facebook, она быстро стала популярной библиотекой, используемой в производстве многими технологическими компаниями . В этой статье мы собираемся обсудить новую дополнительную инфраструктуру React под названием Relay.

Проблема с выборкой данных в действии

По мере роста популярности React масштаб и сложность проектов, построенных с помощью React, росли вместе с ним. React — это, прежде всего, библиотека уровня представления. Это привело к тому, что некоторые команды столкнулись с неизвестной территорией или ограничениями при создании проектов, требующих другой инфраструктуры. Facebook активно предлагал поддержку и руководство во время этих проблем роста.

Flux

Одной из ранних проблем разработчиков, использующих React, была обработка событий. Facebook отреагировал на эту проблему, опубликовав Flux, абстрактный шаблон, который стимулировал однонаправленный поток данных для обработки событий в React.

Я предполагаю некоторое знакомство с Flux, поэтому я не буду обсуждать детали этого в этой статье. Если вы не знакомы с этой темой, вы можете прочитать эту статью от Sandeep Panda или взглянуть на эту страницу о Flux .

Flux поднял экосистему React на новый уровень. Когда разработчики стали ближе знакомиться с Flux, возникли некоторые проблемы. Flux отлично подходит для управления данными как состоянием приложения, но заполнение начального состояния в приложении является источником трений.

Есть несколько проблем, связанных с инициализацией данных Flux. Магазины называют сервер и населяют себя? Используем ли мы методы регидратации от диспетчера? Мы вызываем кучу действий на сервере, чтобы заполнить магазины? Как мы делаем это асинхронно и загружаем все наши данные на сервер в изоморфном приложении перед возвратом ответа?

Что такое реле?

Relay — это новая платформа извлечения данных React, опубликованная Facebook. Целью ретранслятора является четкое решение всех этих проблем с извлечением данных.

Реле имеет несколько основных пунктов продажи:

  • Декларативный: это также главная особенность React. Реле использует декларативное определение стиля кода для зависимостей данных, которое очень похоже на то, как определяются компоненты представления. Это отличное изменение от традиционных императивных API для извлечения данных.

  • Совместное размещение. Определения зависимостей данных располагаются параллельно с определениями компонентов, что значительно упрощает рассуждение о том, какие данные должен представлять компонент пользовательского интерфейса. Это значительно упрощает поиск неисправностей в коде проекта. Глядя на файл, содержащий определение компонента React, сразу видно, какие данные ему нужны для работы.

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

Реле против потока

Flux — абстрактная идея, тогда как Relay — реализация, вдохновленная этой идеей. Реле построено на концепциях Flux и имеет те же понятия диспетчер, действия и хранилища, но они представлены немного по-другому. У ретранслятора есть новая концепция под названием «Компоненты высшего порядка», и мы продолжим эту тему в оставшейся части статьи.

На данном этапе все еще неясно, заменит ли Relay или совпадет с существующими реализациями Flux. Например, Redux , популярная реализация Flux, также использует компоненты высшего порядка. Попытка использовать Redux и Relay вызовет конфликт, связанный с тем, какая инфраструктура связана с компонентом пользовательского интерфейса. В настоящее время ведутся дискуссии об отношениях Redux с Relay .

Компоненты высшего порядка

Компоненты высшего порядка или HOC определяются так же, как и обычные компоненты React. HOCs оборачивают дочерние компоненты пользовательского интерфейса. HOC выполнит свои запросы, а затем отобразит дочерний компонент пользовательского интерфейса, передав данные запроса в качестве подпорок . Поток потока теперь управляется HOC, и последний будет выполнять функции диспетчера. У него есть такие методы, как setQueryParams() Вызов setQueryParams() Запросы, определенные в HOC, обновляются, новые данные выбираются и данные сохраняются в HOC. HOC действует как хранилище Flux, сохраняя эти данные.

Ниже приведен упрощенный пример компонента ProfilePicture Представьте, что у нас есть ProfilePicture Нам нужно получить данные для отображения аватара пользователя. Затем мы создаем Relay HOC для запроса изображений профиля пользователя из базы данных. HOC передает эти данные запроса дочернему компоненту ProfilePicture:

 class ProfilePicture extends React.Component {
  // A standard Profile Picture component
}

// This is our Higher Order Component. It fetches the data to pass
// as props to Profile Picture
module.exports = Relay.createContainer(ProfilePicture, {
  fragments: {
    user: () => Relay.QL`
      fragment on User {
        profilePicture(size: $size) {
          uri,
        },
      }
    `,
  },
});

Наш компонент ProfilePicture По сути, это то, как реле запускает поток потока. Компонент вызывает эти функции поддержки ретрансляции, что эквивалентно вызову действия Flux. Это заставляет ретранслятор получать последние запрошенные данные. После этого он заполняет свое внутреннее хранилище и передает его дочернему компоненту представления HOC в качестве реквизита.

GraphQL

Приведенный выше пример может выглядеть немного странно, особенно эта часть:

 Relay.QL`
      fragment on User {
        profilePicture(size: $size) {
          uri,
        },
      }
    `,

Большая часть магии Relay работает на GraphQL. GraphQL — это новый язык запросов от Facebook, который специализируется на работе со структурами данных графа. Углубленное обсуждение GraphQL выходит за рамки данной статьи, однако вы можете углубить эту тему, прочитав документацию по Relay, в которой она описана. Существующий проект не будет настроен для работы с GraphQL прямо из коробки. Первые рекомендуемые шаги для начала работы с Relay :

  1. Создать схему GraphQL
  2. Создать сервер GraphQL

Следует отметить, что может потребоваться значительный объем работы для преобразования существующего проекта в схему GraphQL и настройки или изменения существующего сервера для обеспечения совместимости с GraphQL. При запуске проекта с нуля, возможно, имеет смысл немедленно использовать Relay. Facebook предоставляет Relay Starter Kit, который выглядит как отличное решение для запуска и запуска с Relay и GraphQL в новом проекте.

Реле без GraphQL

Принимая во внимание все дополнительные накладные расходы, необходимые для настройки GraphQL, ретранслятор Facebook может оказаться неподходящим инструментом для существующих проектов. К счастью, есть еще одна библиотека, вдохновленная Relay, которая может лучше подходить для этих проектов, называемая «реакция-передача». реакция-передача — это проект с открытым исходным кодом, цель которого — стать «вдохновленной ретранслятором библиотекой, основанной на Promises вместо GraphQL».

Если мы обновим приведенный выше пример профиля, чтобы использовать react-trasmit

 // Import Transmit
import Transmit from "react-transmit";

class ProfilePicture extends React.Component {
  // A standard Profile Picture component
}

// This is our Higher Order Component. It fetches the data to pass
// as props to Profile Picture
Transmit.createContainer(ProfilePicture, {
  fragments: {
    user: (userId) => {
      return new Promise(function(resolve, reject) { 
          // Do some Ajax here and resolve the promise
      });
    }
  },
});

Пример реагирования-передачи очень похож на пример ретрансляции. Однако в этом случае user

Текущее состояние реле

Facebook выпустил «технический превью» с открытым исходным кодом Relay . У них есть несколько отличных примеров в репозитории, которые показывают, как работать с Relay, и очень подробный раздел документации .

Похоже, что в настоящее время реле не подходит для изоморфных приложений. Невозможно заставить Relay ждать, пока все зависимости данных не будут загружены, перед рендерингом его дочернего представления, что необходимо на сервере. В случае, если вам интересно, продолжается обсуждение того, как реле будет работать на сервере . На данный момент, это модель, для которой реакция-передача больше подходит в настоящее время.

Что касается будущего Relay, его дорожная карта нацелена на то, чтобы в ближайшее время предоставить несколько ключевых функций:

Выводы

В этой статье мы обсудили новую дополнительную среду React под названием Relay. Реле построено на основе одних и тех же концепций Flux и основано на GraphQL. Как я уже говорил, ретранслятор может быть не лучшим выбором для уже существующих проектов. Однако этот фреймворк довольно новый, и я ожидаю, что он будет становиться все лучше и лучше с каждым выпуском.

Теперь твоя очередь. Ты знал Эстафету? Вы когда-нибудь использовали его в одном из своих проектов?