Мы делали довольно крутые прохладные вещи с 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
...
}
}
Какая поездка!
Время вздохнуть, если вам это нужно! Я знаю, что мы пролетели через много информации только в нескольких параграфах, но я надеюсь, что разделы темы и документации могут помочь вам помимо уроков более подробно. Мы делаем много захватывающих вещей, где я работаю, и я хотел предоставить просто вкус некоторых фантастических инструментов и технологий, которые мы используем здесь. Я надеюсь, что вам понравилось читать это так сильно, как мне понравилось, писать это, и счастливое кодирование!