2019年2月7日

介紹 GraphQL Nexus:程式優先的 GraphQL 伺服器開發

在我們上一篇文章中,我們概述了 SDL 優先的 GraphQL 伺服器開發的問題。本週,我們很高興宣布 GraphQL Nexus,一個程式優先的 GraphQL 函式庫。這是 Tim Griesser 的客座文章。

Introducing GraphQL Nexus
部分1
 
「Schema-First」GraphQL 伺服器開發的問題
部分2
 
(目前閱讀中)
介紹 GraphQL Nexus:程式優先的 GraphQL 伺服器開發
部分3
 
搭配資料庫使用 GraphQL Nexus

重點回顧:SDL 優先開發的問題

前一篇文章所述,SDL 優先的 GraphQL 伺服器開發存在許多挑戰,例如保持 SDL 和解析器同步模組化您的 GraphQL schema 以及實現出色的 IDE 支援。大多數問題可以解決,但僅需學習、使用和整合大量額外工具才能實現。

今天,我們將介紹一個函式庫,該函式庫實作了 GraphQL 伺服器開發的程式優先方法:GraphQL Nexus


GraphQL Nexus 簡介

兩全其美:Schema-first 和 code-first

在上一篇文章中,我們了解了建構 GraphQL 伺服器的 schema-first、SDL-first 和 code-first 方法

  • Schema-first:預先的 schema 設計是開發過程中至關重要的一部分
  • SDL-first:GraphQL schema 的 SDL 版本是 API 的事實來源
  • Code-first:GraphQL schema 是以程式方式建構的

GraphQL Nexus 雖然是程式優先的框架,但仍然可以用於 schema-first 開發。Schema-first 和 code-first 並非相互對立的方法:當它們結合在一起時,會變得更加有用。

使用 Nexus,GraphQL schema 是以程式方式定義和實作的。因此,它遵循其他語言中 GraphQL 伺服器的成熟方法,例如 sangria-graphql (Scala)、graphlq-rubygraphene (Python)。

型別安全、與 GraphQL 生態系統相容且資料不可知

GraphQL Nexus 的設計考慮了 TypeScript/JavaScript 的智能感知。它結合了 TypeScript 泛型、條件型別和型別合併,以提供完整的自動生成型別覆蓋率。Nexus 的核心設計目標是以盡可能少的手動型別註解來獲得最佳的型別覆蓋率。

Type-safe, compatible with GraphQL ecosystem & data-agnostic

Nexus 建立在 graphql-js 的基礎之上,這使其與目前的 GraphQL 生態系統高度相容。

使用 Nexus 定義和實作 GraphQL schema

Nexus 的 API 公開了許多函式,可讓您定義和實作 GraphQL schema 的建構區塊,例如 物件型別聯集介面列舉以及您在 GraphQL 的型別系統中找到的所有其他內容

QueryMutation 型別是 GraphQL schema 中所謂的根型別。Nexus 提供了一個簡寫 API 來定義這些型別

一旦您為 GraphQL schema 定義了所有型別,您就可以使用 makeSchema 函式來建立一個 GraphQLSchema 實例,該實例將成為您的 GraphQL 伺服器的基礎(例如 graphql-yogaapollo-server

makeSchema 還允許您提供 prettier 設定,以便產生的程式碼符合您的樣式指南 💅

GraphQL Nexus 入門

開始使用 Nexus 最快的方式是瀏覽官方範例或使用線上Playground

1) 安裝

由於 GraphQL Nexus 非常依賴 graphql-js,因此在安裝時需要將其作為peer dependency

2) 設定與最佳實務

文件中的最佳實務章節包含許多關於理想編輯器設定和 Nexus 專案結構提示的說明。

由於 GraphQL Nexus 即時產生型別,因此最佳的開發人員體驗是透過在您編寫程式碼時在背景執行的開發伺服器實現的。每當您儲存檔案時,它都會負責更新產生的型別。

使用 TypeScript 時,一種可能的設定是使用 ts-node-dev 作為開發伺服器

然後,您可以在 package.json 中設定用於開發的 npm 指令碼

使用 JavaScript 時,您可以使用 nodemon

然後,您可以在 package.json 中設定用於開發的 npm 指令碼

3) 使用 graphql-yoga 的「Hello World」

完成編輯器設定後,您就可以開始建構您的 GraphQL schema。以下是使用 graphql-yoga 的「Hello World」應用程式的外觀

4) 從您的 SDL 優先 API 遷移

SDL 轉換器可讓您提供 SDL schema 定義並輸出相應的 Nexus 程式碼(不包含任何解析器)

SDL converter


力求提供出色的開發人員體驗

Nexus API 的設計特別注重開發人員體驗。一些核心設計目標是

  • 預設型別安全
  • 可讀性
  • 開發人員人體工學
  • 輕鬆與 Prettier 整合

在您建構 API 時執行的開發伺服器可確保您始終獲得自動完成和錯誤檢查,以檢查您剛引入的 schema 變更。

透過 GraphQL Playground 中新的schema 輪詢功能,當您調整 schema 時,您的 GraphQL API 也會立即重新載入。


讓我們知道您的想法

我們對 GraphQL Nexus 感到非常興奮,並希望您也會如此。歡迎瀏覽官方範例或依照文件中「入門」說明來試用 Nexus。

如果您遇到任何問題,請開啟 GitHub issue 或在我們的 Slack 中聯繫我們。

不要錯過下一篇文章!

訂閱 Prisma 電子報