Рубрики
Без рубрики

Типы потоков с React Releay и GraphQL

Узнайте все о типах потока с React Releay и GraphQL здесь.

Автор оригинала: Kevin Farst.

Мы делали довольно крутые прохладные вещи с JavaScript в моей компании, и я хотел написать о некоторых инструментах, которые мы используем для «Игра JavaScript’s». Очевидно, что JS взорвался со всеми новыми рамками и пакетами, чтобы улучшить его универсальность, и с точки зрения веб-сайтов, в которой можно реагировать на самые популярные рамки. Хотя вы можете найти реагированные проекты в живых и хорошо во многих множественных стартапах, одна вещь, которую я чувствую, не хватает достаточно покрытых, – это некоторые из новых механизмов привлечения данных, которые могут не быть вашими общими конечными точками API на стороне серверов, а также способность приносить Статический набрав к JavaScript.

Удобно, что этот пост бывает прикоснуться к обоим темам, и решение этих двух предметов, которые мы используем в наших проектах. Это ни в коем случае не предназначено для того, чтобы быть исчерпывающим уроком или введением. Однако я настоятельно рекомендую вам сначала узнать об этих темах, проверив документацию для Graphql и Поток Отказ Я хотел кратко прикоснуться к тому, как мы объединяем их реагированными на более приятный опыт развития.

Поток

Из документов я связанных выше,

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

Короче говоря, поток позволяет статическими набрать в JavaScript, похожий на то, что вы, возможно, видели в Java или Swift. Пара простых примеров, где это действительно может быть полезно, может включать в себя:

  • Обеспечение функций не только получает аргументы правильного типа, но и объект или примитив, который возвращается из функции, также имеет правильный тип
// @flow
function square(n: number): number {
  return n * n;
}

square("2"); // Error!
{% endhighlight %}

* Making sure objects have their expected properties, and those properties have the correct types
{% highlight javascript %}
// @flow
type MyObject = {
  foo: number,
  bar: boolean,
  baz: string,
};

var val: MyObject = { /* ... */ };
function method(val: MyObject) { /* ... */ }
class Foo { constructor(val: MyObject) { /* ... */ } }

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

График

В соответствии с нашими введениями темы от документации GraphQL выше:

GraphQL – это язык запроса для вашего API, и среда выполнения на стороне сервера для выполнения запросов, используя систему типа, которую вы определяете для ваших данных. GraphQL не привязан к любой конкретной базе данных или двигателе хранения и вместо этого поддерживается существующий код и данные.

Это все по-прежнему достигается через запрос на конечную точку, однако запросы к этой конечной точке могут быть гораздо более многослойными и структурированными, а также очень гибкими в том, что вам нужно только для получения необходимых вам данных, основанных на схеме определение. Опять же, я бы сильно Поощряйте вас читать документы, поскольку это определение даже не начинает поцарапать поверхность, но для воспроизведения этой статьи пример может быть:

  • Запрос, построенный на стороне клиента и отправляется на специфическую конечную точку GraphQL
query HeroNameAndFriends($episode: Episode) {
  hero(episode: $episode) {
    name
    friends {
      name
    }
  }
}
  • Переменные, которые передаются к конечной точке вместе с запросом
{
  "episode": "JEDI"
}
  • Хорошее структурированное ответие, соответствующее структуре запроса, которая была отправлена на сервер
{
  "data": {
    "hero": {
      "name": "R2-D2",
      "friends": [
        {
          "name": "Luke Skywalker"
        },
        {
          "name": "Han Solo"
        },
        {
          "name": "Leia Organa"
        }
      ]
    }
  }
}

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

Служба GraphQL создается путем определения типов и полей на этих типах, а затем предоставление функций для каждого поля на каждом типе.

Поскольку поток все о определении типа, это не удивительно, что эти две темы могут легко пойти в руку. Давайте посмотрим, как они вписываются в экосистему реагирования.

Реагировать и реле

Глядя на запрос на графику выше, вложенная природа делает его очень похожим на вложенные и инкапсулированные функциональные возможности реагирования. Поскольку данные вытекают через вложенные компоненты, и компонент должен знать только о потребностях данных, запрос и схему GraphQL можно структурировать таким образом, чтобы вложенные объекты, возвращаемые в результатах, могут быть разделены и отправлены через свойства компонентов. в родительских отношениях. Таким образом, модель данных и модель просмотра могут более тесно имитировать друг друга и по своей природе становятся более управляемыми, когда они меняются и развиваются вместе.

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

import React from 'react';
import { QueryRenderer, graphql } from 'react-relay';

class Example extends React.Component {
  render() {
    return (
       {
          if (error) {
            return 
{error.message}
; } else if (props) { return
{props.page.name} is great!
; } return
Loading
; }} /> ); } }

Реле и фрагменты контейнеры

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

То, что это переводит, – это компонент более высокого порядка, предоставляемый реле, называемый A Фрагмент контейнер Отказ Он опирается на названную «штуку» запроса GRAGHQL, который определяется в дочернем компоненте, затем на ссылке на запрос родительской графики. Реле достаточно уютное, чтобы собрать эти кусочки запросов перед выполнением запроса, затем повторно реиндирует каждый компонент с Только Данные, определенные фрагментом, он содержит.

Еще один пример от документов, если есть верхний уровень составная часть:

class TodoList extends React.Component {
  render() {
    return (
      ' itself.
              title
              # Include a reference to the fragment from the child component.
              todoItems {
                ...TodoItem_item
              }
            }
          }
        `}
        render={({error, props}) => {
          if (error) {
            
{error.message}
; } else if (props) { {props.list.title} {props.list.todoItems.map(item => )} } else {
Loading
; } }} /> ); } }

Фрагмент контейнер для Компонент будет выглядеть так:

class TodoItem extends React.Component {
  render() {
    const item = this.props.item;
    // ...
  }
}

export default createFragmentContainer(
  TodoItem,
  item: graphql`
    # Fragment name uses underscore to denote property name
    fragment TodoItem_item on Todo {
      # Properties available on the item component property
      text
      isComplete
    }
  `,
);

Короче, даже если данные все еще передаются через цепочку компонентов, каждый компонент по-прежнему определяет что Данные им нужны и Как Это структурировано.

Реле и расход

Как уже упоминалось в разделе расхода выше, тоток отлично подходит для проверки и проверки как пользовательских типов, которые вы создаете и Сгенерированные типы. Если мы применим это оператор для Graphql, реле будет принимать эти запросы и возвращать фактические объекты в форме этих запросов и передача их в качестве свойств к компонентам.

Вы можете себе представить, какая боль это будет вручную добавлять эти огромные определения типа в соответствии с определениями запроса. К счастью, Пакет NPM реле-компилятор делает его почти автоматическим. Когда запрос обновляется, простая команда в терминале может генерировать или обновлять сгенерированные типы потоков для этих запросов. Как это круто?!

Когда команда запускается, определения вставляются в __Generated__ Папка вложена в папку, которая содержит компонент. Если и Компоненты были в папке SRC/Компоненты/Todo/ Вы найдете определения сгенерированного типа внутри SRC/Компоненты/TODO/__ __ Сгенерированы __ Отказ Простой Импорт Заявление вытащит определение, и тип может быть применен к компоненту реквизит Переменная.

import type { TodoListQueryType } from './__generated__/TodoListQueryType';

class TodoList extends React.Component {
  constructor(props: TodoListQueryType) {
    ...
  }
}

Виола! Еще один аккуратный маленький тидбит, если вы пытаетесь получить доступ к вложенному типу в типе запроса GraphQL, вы можете использовать тип утилиты потока, $ PropertyType назначить вложенный тип в свойство.

import type { TodoListQueryType } from './__generated__/TodoListQueryType';

class TodoList extends React.Component {
  list: $PropertyType

  constructor(props: TodoListQueryType) {
    list = props.list
    ...
  }
}

Какая поездка!

Время вздохнуть, если вам это нужно! Я знаю, что мы пролетели через много информации только в нескольких параграфах, но я надеюсь, что разделы темы и документации могут помочь вам помимо уроков более подробно. Мы делаем много захватывающих вещей, где я работаю, и я хотел предоставить просто вкус некоторых фантастических инструментов и технологий, которые мы используем здесь. Я надеюсь, что вам понравилось читать это так сильно, как мне понравилось, писать это, и счастливое кодирование!