Анонсируем GraphQL Yoga 2.0!


Эта статья была опубликована во вторник, 29 марта 2022 года, автором Charly Poly @ The Guild Blog

Сегодня мы невероятно рады поделиться с вами новым GraphQL Yoga! Этот релиз стал возможен благодаря вашему вкладу, проблемам и обратной связи.

Гильдия взяла на себя разработку GraphQL Yoga от Prisma в начале 2021 года, и благодаря растущему сообществу инструментов в области GraphQL, в частности, недавно появившемуся Envelop, мы смогли переписать GraphQL Yoga 2.0 с нуля, поставив во главу угла простоту настройки, производительность и удобство для разработчиков.

GraphQL Yoga по-прежнему может похвастаться подходом «конвенция вместо конфигурации» и свободой использования ваших любимых библиотек, от HTTP до построения схемы.

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

Для создания сервера GraphQL Yoga требуется один импорт и всего несколько строк кода, чтобы начать обслуживать API. Кроме того, вы получаете GraphiQL для еще большего упрощения разработки.

// 1. Import GraphQL Yoga
import { createServer } from '@graphql-yoga/node'

// 2. Create your server
const server = createServer({
  schema: {
    typeDefs: /* GraphQL */ `
      type Query {
        hello: String
      }
    `,
    resolvers: {
      Query: {
        hello: () => 'Hello Hello Hello'
      }
    }
  }
})

// 3. Serve the API and GraphiQL
server.start()
Вход в полноэкранный режим Выход из полноэкранного режима

Опыт использования Yoga v2

Ваш стек и привычки

Основная цель Yoga v2 — позволить вам использовать всю экосистему GraphQL, будучи совместимым с большинством существующих схем, библиотек HTTP-серверов и сред развертывания.

Построенный на модульном и расширяемом GraphQL Server, Yoga v2 позволяет вам использовать предпочитаемый подход к проектированию схем и библиотеку HTTP-сервера.

Например, Yoga v2 полностью совместим с Express и Nexus без дополнительных пакетов:

import express from 'express'
import { makeSchema, queryType } from 'nexus'
import { createServer } from '@graphql-yoga/node'

const Query = queryType({
  definition(t) {
    t.string('hello', { resolve: () => 'hello world!' })
  }
})
const schema = makeSchema({
  types: [Query]
})

const graphQLServer = createServer({ schema })

const app = express()

// Bind GraphQL Yoga to the `/graphql` endpoint
// Here it takes the request and response objects and handles them internally
app.use('/graphql', graphQLServer)

app.listen(4000, () => {
  console.log('Running a GraphQL API server at http://localhost:4000/graphql')
})
Войти в полноэкранный режим Выйти из полноэкранного режима

То же самое относится к GraphQL Tools, Pothos, Nexus, TypeGraphQL, SDL, первым подходам к проектированию схем, graphql-js, Apollo Tools, Fastify, Koa, Next.js, SvelteKit и Deno.

Помимо совместимости библиотек проектирования схем и HTTP-серверов, Yoga v2 делает развертывание GraphQL API в любой среде беспроблемным (Vercel Functions, Cloudflare Workers, AWS Lambda и другие).

Здесь представлен GraphQL API, построенный с помощью GraphQL Modules, развернутый на Cloudflare Workers:

import { createServer } from '@graphql-yoga/common'

import { createApplication } from 'graphql-modules'
import { helloWorldModule } from './helloWorld'

const application = createApplication({
  modules: [helloWorldModule]
})

const server = createServer({ schema: application.schema })

server.start()
Вход в полноэкранный режим Выход из полноэкранного режима

Производительность на кончиках ваших пальцев

Батарейки в комплекте

Yoga v2 поставляется с разумными настройками по умолчанию, чтобы ускорить разработку, с полной поддержкой TypeScript.

Функции, характерные для современных GraphQL API, такие как загрузка файлов, поддержка подписки, расширенная обработка ошибок или CORS, встроены в Yoga:

import { createServer, GraphQLYogaError } from '@graphql-yoga/node'

// Provide your schema
const server = createServer({
  schema: {
    typeDefs: /* GraphQL */ `
      # adding this custom scalar enables file upload support
      scalar Upload

      type Query {
        hello: String
      }

      type Subscription {
        countdown(from: Int!): Int!
      }

      type Mutation {
        readTextFile(file: Upload!): String
      }
    `,
    resolvers: {
      Query: {
        hello: () => 'world'
      },
      Subscription: {
        countdown: {
          // This will return the value on every 1 sec until it reaches 0
          subscribe: async function* (_, { from }) {
            for (let i = from; i >= 0; i--) {
              await new Promise(resolve => setTimeout(resolve, 1000))
              yield { countdown: i }
            }
          }
        }
      },
      Mutation: {
        readTextFile: async (_, { file }: { file: File }) => {
          let textContent = null
          try {
            textContent = await file.text()
          } catch (e) {
            // return an error visible by the client
            throw new GraphQLYogaError(`Failed to parse file`)
          }
          return textContent
        }
      }
    }
  }
})

// We now serve a GraphQL API with Subscriptions (over SSE), CORS,
// and File uploads support!
server.start()
Войти в полноэкранный режим Выход из полноэкранного режима

Yoga v2 также предоставляет API для обработки логов, расширенные сценарии использования подписки (через WS, Pub/Sub), поддержку федерации Apollo и многое другое.

Легко расширяйте свой API с помощью плагинов Envelop

GraphQL Yoga поддерживает Envelop из коробки, что дает вам больший контроль и возможность подключаться к фазам выполнения GraphQL.

Здесь мы создаем полнофункциональный GraphQL API с правилами безопасности, кэшем ответов и отчетом об ошибках с помощью всего нескольких строк кода:

import { createServer } from '@graphql-yoga/node'

import { useDepthLimit } from '@envelop/depth-limit'
import { useResponseCache } from '@envelop/response-cache'
import { useSentry } from '@envelop/sentry'

const server = createServer({
  schema: {
    typeDefs: /* GraphQL */ `
      type Query {
        hello: String
      }
    `,
    resolvers: {
      Query: {
        hello: () => 'Hello Hello Hello'
      }
    }
  },
  plugins: [
    useDepthLimit({
      // set up some security rules
      maxDepth: 10
    }),
    useResponseCache(), // speed up our server with a response cache
    useSentry() // report unexpected errors to sentry
  ]
})

// Start the server and explore http://localhost:4000/graphql
server.start()
Вход в полноэкранный режим Выход из полноэкранного режима

В настоящее время Envelop Plugin предлагает более 35+ плагинов, охватывающих большинство стандартных функций GraphQL API, необходимых вам в производстве.

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

Готовый к производству

GraphQL Yoga v2 был создан в производстве для использования на производстве.

В реальных условиях наших проектов (например, GraphQL Mesh) и некоторых наших клиентов производительность была высокоприоритетной задачей.
Ядро Yoga является максимально производительным, и мы постоянно следим за этим и улучшаем его.

Кроме того, репозиторий Yoga V2 проверяет производительность при каждом коммите и Pull Request, поэтому мы всегда можем отследить любой регресс производительности.

И последнее, но не менее важное: каждый коммит гарантированно запускается на всех объектах развертывания, таких как AWS Lambda или Cloudflare workers, с помощью набора тестов End-To-End!

Мы продолжаем наши усилия по продвижению GraphQL Yoga в большее количество производственных сред со скорым выпуском Redwood 1.0, который использует Yoga 2.0 в качестве сервера GraphQL по умолчанию.

Соответствующий стандартам сервер GraphQL

Подобно тому, как TypeScript стремится соответствовать ECMAScript, GraphQL Yoga основан на нескольких официальных и признанных спецификациях:

  • GraphQL-spec, GraphQL-over-HTTP: гарантирует работу вашего GraphQL API со всеми существующими клиентами GraphQL (Apollo, Relay, urql и др.).
  • GraphQL-Multipart-Request: обеспечивает отличную поддержку загрузки файлов
  • W3C Fetch API: мы принимаем будущее Node.js и обеспечиваем одинаковые возможности для разработчиков на всех платформах.

Возможности GraphQL из будущего

Yoga v2 поддерживает некоторые экспериментальные функции GraphQL, такие как @defer и @stream, позволяя вам почувствовать вкус будущего GraphQL (с совместимыми клиентами, такими как urql).

Также, благодаря системе плагинов Envelop, Yoga v2 может выступать в роли «Babel for GraphQL», предоставляя вам возможность использовать функции, которых еще нет в спецификации GraphQL, но которые сегодня очень полезны в производстве, такие как @defer, @stream и @oneOf.

Начните работу с Yoga v2

Yoga v2 обеспечивает лучший опыт работы с GraphQL, предоставляя вам свободу в использовании предпочитаемого стека и инструментов.

Начните работу с нуля с помощью нашего нового учебника

Хотите попробовать? Попробуйте наш совершенно новый учебник! Он поможет вам построить полнофункциональный современный API с помощью GraphQL Yoga.

Эпизод #36 из graphql.wtf также является отличным введением в GraphQL Yoga 2.0:

… или перенести существующий GraphQL-сервер на Yoga.

Все возможности Yoga v2 хорошо документированы на сайте, и у нас также есть несколько руководств по миграции (с v1, Apollo Server и Express GraphQL).

Что дальше

Yoga v2 — это самый большой и важный проект, который мы выпустили на сегодняшний день; тем не менее, это только начало нашего видения GraphQL-сервера.

Мы с нетерпением ждем ваших вопросов, отзывов пользователей и запросов на функции/PR, и уже планируем новые функции, такие как Enhanced Plugin System, которая будет предоставлять возможности, аналогичные Envelop, но на уровне запросов.

Не стесняйтесь обращаться к нам в Twitter и поддержите нас, поделившись этой статьей!

Оцените статью
devanswers.ru
Добавить комментарий