В чем разница между Falcor и GraphQL?

GraphQL состоит из системы типов, языка запросов и выполнения семантика, статическая валидация и интроспекция типов, каждая из которых ниже. Чтобы провести вас через каждый из этих компонентов, мы написали пример, предназначенный для иллюстрации различных частей GraphQL.

- https://github.com/facebook/graphql

Falcor позволяет вам представлять все ваши удаленные источники данных в виде единого модели домена через виртуальный график JSON. Вы так же кодируете где находятся данные, будь то в памяти на клиенте или по сети на сервере.

- http://netflix.github.io/falcor/

В чем разница между Falcor и GraphQL (в контексте Relay)?

Ответ 1

Я просмотрел Angular Воздушный эпизод 26: FalcorJS и Angular 2, где Jafar Husain отвечает, как GraphQL сравнивается с FalcorJS. Это сводка (перефразирование):

  • FalcorJS и GraphQL решают одну и ту же проблему (запрос данных, управление данными).
  • Важным отличием является то, что GraphQL является языком запросов, а FalcorJS - нет.
  • Когда вы запрашиваете у FalcorJS ресурсы, вы очень четко запрашиваете конечную серию значений. FalcorJS поддерживает такие вещи, как диапазоны, например. genres[0..10]. Но он не поддерживает открытые запросы, например. genres[0..*].
  • GraphQL устанавливается на основе: дайте мне все записи, где true, порядок от этого и т.д. В этом смысле язык запросов GraphQL более мощный, чем FalcorJS.
  • С GraphQL у вас есть мощный язык запросов, но вы должны интерпретировать этот язык запросов на сервере.

Jafar утверждает, что в большинстве приложений типы запросов, которые идут от клиента к серверу, имеют одну и ту же форму. Таким образом, наличие конкретных и предсказуемых операций, таких как get и set, предоставляет больше возможностей для использования кеша. Кроме того, многие разработчики знакомы с отображением запросов с использованием простого маршрутизатора в архитектуре REST.

В конце обсуждения решается вопрос о том, превосходит ли мощность, которая приходит с GraphQL, сложность.

Ответ 2

Теперь я написал приложения с обеими библиотеками, и я могу согласиться со всем, что было в сообщении Gajus, но нашел несколько важных вещей, наиболее важных в моем собственном использовании фреймворков.

  • Вероятно, самая большая практическая разница заключается в том, что большинство примеров и, предположительно, проделанная до этого момента на GraphQL была сосредоточена на интеграции GraphQL с системой Relay - Facebook для интеграции виджетов ReactJS с их требованиями к данным. С другой стороны, FalcorJS имеет тенденцию действовать отдельно от системы виджетов, что означает, что может быть проще интегрироваться в клиент не-React/Relay и что он будет делать меньше для вас автоматически с точки зрения соответствия зависимостей данных виджета с виджетами.
  • Оборотная сторона FalcorJS, являющаяся гибкой в ​​интеграции на стороне клиента, заключается в том, что ее можно очень усомниться в том, как сервер должен действовать. У FalcorJS действительно есть возможность "вызвать этот запрос через HTTP", хотя Jafar Husain, похоже, не очень-то говорит об этом, и как только вы включите их, то, как клиентские библиотеки реагируют на информацию о сервере, весьма схожи, за исключением того, что GraphQL/Relay добавляет слой конфигурации. В FalcorJS, если вы возвращаете значение для фильма, ваше возвращаемое значение лучше сказать "фильм" , тогда как в GraphQL вы можете описать, что даже если запрос возвращает "фильм" , вы должны поместить это в хранилище данных на стороне клиента как "фильм" ". - это часть компромисса между властью и сложностью, о которой говорил Гаюс.
  • На практической основе GraphQL и Relay, по-видимому, более развиты. Jafar Husain упомянул, что следующая версия интерфейса Netflix будет работать хотя бы частично на FalcorJS, тогда как команда Facebook упомянула, что они используют некоторую версию стека GraphQL/Relay в производстве более 3 лет.
  • Сообщество разработчиков с открытым кодом вокруг GraphQL и Relay, похоже, процветает. Есть большое количество хорошо поддержанных проектов поддержки вокруг GraphQL и Relay, тогда как я лично нашел очень мало вокруг FalcorJS. Также базовый репозиторий github для Relay (https://github.com/facebook/relay/pulse) значительно активнее, чем репозиторий github для FalcorJS (https://github.com/netflix/falcor/pulse). Когда я впервые вытащил репозиторий Facebook, примеры были сломаны. Я открыл проблему github, и она была исправлена ​​в течение нескольких часов. С другой стороны, проблема github, которую я открыла на FalcorJS, не имела официального ответа через две недели.

Ответ 3

UPDATE: я нашел очень полезный комментарий под своим сообщением, который я хочу поделиться с вами в качестве дополнения к основному контенту: введите описание изображения здесь

Что касается отсутствия примеров, вы можете найти awesome-falcorjs repo userful, существуют различные примеры использования Falcor CRUD: https://github.com/przeor/awesome-falcorjs... Во-вторых, есть книга под названием " "Освоение разработки полного стека" включает также Falcor (хороший способ узнать, как его использовать):

введите описание изображения здесь

ORGINAL POST BELOW:

FalcorJS (https://www.facebook.com/groups/falcorjs/) гораздо проще, чем эффективнее по сравнению с Relay/GraphQL.

Кривая обучения для реле GraphQL + ОГРОМНА: введите описание изображения здесь

В своём кратком сводке: Идите на Фалькор. Используйте Falcor в своем следующем проекте, пока у вас не будет большого бюджета и много времени для обучения для вашей команды, а затем используйте RELAY + GRAPHQL.

GraphQL + Relay имеет огромный API, которым вы должны быть эффективны. У Falcor есть небольшой API, и его очень легко понять любому внешнему разработчику, который знаком с JSON.

Если у вас есть проект AGILE с ограниченными ресурсами → затем перейдите к FalcorJS!

МОЕ СУБЪЕКТИВНОЕ мнение: FalcorJS на 500% + легче быть эффективным в javascript с полным стеком.

Я также опубликовал некоторые стартовые комплекты FalcorJS в моем проекте (+ более полноэкранные примеры проектов falcor): https://www.github.com/przeor

Подробнее о технических деталях:

1) Когда вы используете Falcor, вы можете использовать как на интерфейсе, так и на бэкэнд:

импортировать falcor из 'falcor';

а затем постройте свою модель на основе.

... вам также нужны две библиотеки, которые просты в использовании на бэкэнд: a) falcor-express - вы используете его один раз (например, app.use('/model.json', FalcorServer.dataSourceRoute(() = > new NamesRouter()))). Источник: https://github.com/przeor/falcor-netflix-shopping-cart-example/blob/master/server/index.js

b) falcor-router - там вы определяете маршруты SIMPLE (например, route: '_view.length'). Источник: https://github.com/przeor/falcor-netflix-shopping-cart-example/blob/master/server/router.js

Falcor - кусок пирога с точки зрения кривой обучения.

Вы также можете увидеть документацию, которая намного проще, чем FB lib, и также проверить статью "почему вы должны заботиться о falcorjs (netflix falcor).

2) Relay/GraphQL скорее всего представляет собой огромный корпоративный инструмент.

Например, у вас есть две разные документы, о которых отдельно говорят:

a) Реле: https://facebook.github.io/relay/docs/tutorial.html - Контейнеры - Маршруты - Корневой контейнер - Готовность - Мутации - Сетевой уровень - Плагин для Babel Relay - GRAPHQL

  • Спецификация реле GraphQL
  • Идентификация объекта
  • Подключение
  • Мутации
  • Дополнительная литература
  • ССЫЛКА API

  • Реле

  • RelayContainer
  • Relay.Route
  • Relay.RootContainer
  • Relay.QL
  • Relay.Mutation
  • Relay.PropTypes
  • Relay.Store
  • ИНТЕРФЕЙС

  • RelayNetworkLayer

  • RelayMutationRequest
  • RelayQueryRequest

b) GrapQL: https://facebook.github.io/graphql/

  • 2Language
  • 2.1. Источник текста
  • 2.1.1Unicode
  • 2.1.2. Простое пространство
  • 2.1.3. Терминаторы
  • 2.1.4Comments
  • 2.1.5. Значимые запятые
  • 2.1.6Лекические токены
  • 2.1.7 Игнорированные токены
  • 2.1.8Punctuators
  • 2.1.9Names
  • Документ 2.2Query
  • 2.2.1Operations
  • 2.2.2Выборы выбора
  • 2.2.3Fields
  • 2.2.4Arguments
  • 2.2.5 Псевдоним поля
  • 2.2.6Fragments
  • 2.2.6.1Type Условия
  • 2.2.6.2Интерфейсные фрагменты
  • 2.2.7Введение значений
  • 2.2.7.1Int Value
  • 2.2.7.2 Значение флагов
  • 2.2.7.3Boolean Value
  • 2.2.7.4 Значение строки
  • 2.2.7.5Enum Value
  • 2.2.7.6 Значение списка
  • 2.2.7.7Введение значений объекта
  • 2.2.8Variables
  • 2.2.8.1Переменное использование внутри фрагментов
  • 2.2.9Вводные типы
  • 2.2.10Directives
  • 2.2.10.1 Директивы об устранении недостатков
  • Система 3Type
  • 3.1Types
  • 3.1.1Scalars
  • 3.1.1.1 Встроенные скаляры
  • 3.1.1.1.1Int
  • 3.1.1.1.2Float
  • 3.1.1.1.3String
  • 3.1.1.1.4Boolean
  • 3.1.1.1.5ID
  • 3.1.2Objects
  • 3.1.2.1Объектные аргументы поля
  • 3.1.2.2Объект Отклонение поля
  • 3.1.2.3 Проверка типа объекта
  • 3.1.3Interfaces
  • 3.1.3.1 Проверка подлинности типа
  • 3.1.4Unions
  • 3.1.4.1 Проверка типа подключения
  • 3.1.5Enums
  • 3.1.6Интересные объекты
  • 3.1.7Lists
  • 3.1.8Non-Null
  • 3.2Directives
  • [email protected]
  • [email protected]
  • 3.3. Типы запуска
  • 4Introspection
  • 4.1 Общие принципы
  • 4.1.1 Соглашения об именах
  • 4.1.2Documentation
  • 4.1.3Deprecation
  • 4.1.4Type Name Introspection
  • 4.2Schema Introspection
  • 4.2.1 Тип "__Type"
  • 4.2.2 Типы типов
  • 4.2.2.1Scalar
  • 4.2.2.2Object
  • 4.2.2.3Union
  • 4.2.2.4Interface
  • 4.2.2.5Enum
  • 4.2.2.6Возвращаемый объект
  • 4.2.2.7List
  • 4.2.2.8Non-нуль
  • 4.2.2.9Соединение списка и не нуль
  • 4.2.3 Тип __Field
  • 4.2.4 Тип __InputValue
  • 5Validation
  • 5.1Operations
  • 5.1.1Именованные определения операций
  • 5.1.1.1Описание Название Уникальность
  • 5.1.2. Определения анонимной работы
  • 5.1.2.1Некоторые анонимные действия
  • 5.2Fields
  • 5.2.1. Выбор полей для типов объектов, интерфейсов и союзов.
  • 5.2.2. Слияние полей.
  • 5.2.3. Полевые выборки
  • 5.3Arguments
  • 5.3.1Имя имен
  • 5.3.2 Уникальность действия
  • 5.3.3. Правильность значений значений аргументов
  • 5.3.3.1 Совместимые значения
  • 5.3.3.2 Необходимые аргументы
  • 5.4Fragments
  • 5.4.1 Объявления об объявлении
  • 5.4.1.1 Идентификация имени фрагмента
  • 5.4.1.2 Существование типа разрыва фрагмента
  • 5.4.1.3 Осколки по составным типам
  • 5.4.1.4 Необходимо использовать фрагменты
  • 5.4.2 Распространение фрагментов
  • 5.4.2.1 Определенная цель распространения фрагмента
  • 5.4.2.2 Фрагментные спреды не должны формировать циклы
  • 5.4.2.3 Возможно распространение фрагментации
  • 5.4.2.3.1Объектные спреды в области объектов
  • 5.4.2.3.2Абстрактные спреды в области объектов
  • 5.4.2.3.3Объектные спреды в абстрактной области
  • 5.4.2.3.4Абстрактные спреды в абстрактной области
  • 5.5Values ​​
  • 5.5.1 Уникальная уникальность поля объекта
  • 5.6Directives
  • 5.6.1 Определены директивы
  • 5.7Variables
  • 5.7.1Variable Uniquity
  • 5.7.2Вводимые значения по умолчанию правильны.
  • 5.7.3Variables - это типы ввода.
  • 5.7.4Все переменная использует определенные
  • 5.7.5Все используемые переменные
  • 5.7.6 Разрешено использование переменных переменных
  • 6Execution
  • 6.1Оценка запросов
  • 6.2Переключающие переменные
  • 6.3Оценка операций
  • 6.4Оценка выбора наборов
  • 6.5Оценка набора сгруппированных полей
  • 6.5.1. Записи входа
  • 6.5.2Ночная оценка
  • 6.5.3Серверное выполнение
  • 6.5.4 Обработка ошибок
  • 6.5.5Nullability
  • 7Response
  • 7.1Serialization Format
  • 7.1.1JSON Сериализация
  • 7.2Отчетный формат
  • 7.2.1Data​​li >
  • 7.2.2Errors
  • AAppendix: условные обозначения
  • A.1 Неконтекстная грамматика
  • A.2Легическая и синтаксическая грамматика
  • A.3Грамматическая нотация
  • A.4. Семантика грамматики
  • A.5Algorithms
  • BAppendix: Краткое описание грамматики
  • B.1Ignored Tokens
  • B.2Lexical Tokens
  • Документ B.3Query

Это ваш выбор:

Простой сладкий и короткий документированный инструмент Falcor JS VERSUS с огромным уровнем корпоративного уровня с длинной и расширенной документацией как GraphQL & Relay

Как я уже говорил, если вы являетесь сторонним разработчиком, который понимает идею использования JSON, то реализация графика JSON от команды Falcor - лучший способ выполнить ваш проект полного стека.

Ответ 4

Ли Байрон один из инженеров позади GraphQL сделал AMA on hashnode, вот его ответ, когда задал этот вопрос:

  • Falcor возвращает Observables, только значения GraphQL. Для того, чтобы Netflix хотел использовать Falcor, это имеет для них большой смысл. Они делают несколько запросов и представляют данные по мере готовности, но это также означает, что клиентский разработчик должен напрямую работать с Observables. GraphQL - это модель запроса/ответа и возвращает обратно JSON, который трижды легко использовать. Relay добавляет обратно в динамику, которую представляет Falcor, сохраняя при этом только простые значения.
  • Система типов. GraphQL определяется с точки зрения системы типов, что позволяет нам создавать множество интересных инструментов, таких как GraphiQL, генераторы кода, обнаружение ошибок и т.д. Falcor гораздо более динамичен, который ценен сам по себе, но ограничивает способность делать такие вещи.
  • Использование сети. GraphQL был первоначально разработан для работы с новостной лентой Facebook на устройствах с низким уровнем доступа в сетях с более низким уровнем конца, поэтому он подходит для больших целей, чтобы вы могли объявить все, что вам нужно, в одной сети чтобы минимизировать задержку. С другой стороны, Falcor часто выполняет многократные поездки для сбора дополнительных данных. Это действительно просто компромисс между простотой системы и управлением сетью. Для Netflix они также работают с очень низкими устройствами (например, Roku stick), но предположение о том, что сеть будет достаточно хороша для потокового видео.

Изменить: Falcor действительно может пакетные запросы, что делает комментарий об использовании сети неточным. Благодаря @PrzeoR

Ответ 5

Короче говоря, Falcor или GraphQL или Restful решают ту же проблему - предоставляют инструмент для эффективного запроса/управления данными.

Как они отличаются друг от друга тем, как они представляют свои данные:

  • Falcor хочет, чтобы вы считали свои данные очень большим виртуальным деревом JSON и использовали get, set и вызов для чтения, записи данные.
  • GraphQL хочет, чтобы вы считали свои данные группой предопределенных типизированных объектов и использовали запросы и мутации для чтения, записи данных.
  • Restful хочет, чтобы вы считали свои данные как группу ресурсов и использовали HTTP-глаголы для чтения, записи данных.

Всякий раз, когда нам нужно предоставлять данные для пользователя, мы получаем что-то вроде: client → query → {layer translate query to data ops} → data.

После борьбы с GraphQL, Falcor и JSON API (и даже ODdata) я написал свой собственный уровень запросов данных. Это проще, проще в освоении и более эквивалентно GraphQL.

Проверьте это:
https://github.com/giapnguyen74/nextql

Он также интегрируется с featherjs для запроса/мутации реального времени. https://github.com/giapnguyen74/nextql-feathers