Мы делали довольно крутые прохладные вещи с 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!; } returnLoading; }} /> ); } }
Реле и фрагменты контейнеры
Реле – это довольно прохладный каркас, но я думаю, что одна из функций, которые делают его Очень Мощность – это его способность разрешать компоненты реагирования, чтобы определить данные, которые им нужны, даже вложенные компоненты, которые не имеют прямого
Определение компонента, как мы видели выше.
То, что это переводит, – это компонент более высокого порядка, предоставляемый реле, называемый 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: $PropertyTypeconstructor(props: TodoListQueryType) { list = props.list ... } }
Какая поездка!
Время вздохнуть, если вам это нужно! Я знаю, что мы пролетели через много информации только в нескольких параграфах, но я надеюсь, что разделы темы и документации могут помочь вам помимо уроков более подробно. Мы делаем много захватывающих вещей, где я работаю, и я хотел предоставить просто вкус некоторых фантастических инструментов и технологий, которые мы используем здесь. Я надеюсь, что вам понравилось читать это так сильно, как мне понравилось, писать это, и счастливое кодирование!