GraphQL LogoGraphQL

常見問題集 (FAQ)

入門

我為什麼應該使用 GraphQL?#

這取決於你的使用案例,但一般來說,GraphQL 有幾個關鍵特色脫穎而出。例如,GraphQL 能讓你

我們的首頁 概述了更多使用 GraphQL 的理由。

你可以在不改寫整個應用程式的狀況下,試用 GraphQL。例如,從一個封裝現有 REST 呼叫的 HTTP 要求開始。你的 GraphQL 架構商業領域模型 可以逐漸擴充。我們建議一開始先專注於一個使用案例,只建構該案例所需的架構部分。

GraphQL 是否取代 REST?#

不,不一定。兩者都處理 API,並且可以從業務角度提供類似的目的。GraphQL 通常被視為 REST 的替代方案,但並非明確的取代方案。

GraphQL 和 REST 實際上可以在您的堆疊中並存。例如,您可以將 REST API 抽象在GraphQL 伺服器之後。這可以使用根解析器將 REST 端點遮罩成 GraphQL 端點來完成。

對於 GraphQL 與 REST 的比較,請查看如何使用 GraphQL,以取得意見化的觀點。

GraphQL 是否像 SQL 一樣的資料庫語言?#

不,但這是常見的誤解。

GraphQL 是通常用於遠端客戶端伺服器通訊的規範。與 SQL 不同,GraphQL 與用於擷取資料和儲存變更的資料來源無關。存取和處理資料是使用稱為解析器的任意函數來執行。GraphQL 會協調和彙總這些解析器函數的資料,然後將結果傳回給客戶端。通常,這些解析器函數應委派給業務邏輯層,負責與各種基礎資料來源進行通訊。這些資料來源可以是遠端 API、資料庫、本機快取,以及您的程式語言幾乎可以存取的任何其他內容。

如需有關如何讓 GraphQL 與您的資料庫互動的更多資訊,請查看我們的解析器文件

如何學習 GraphQL?#

有許多資源可協助您學習 GraphQL,包括本網站。在 我們的文件 中,您會找到一系列文章,說明基本的 GraphQL 概念及其運作方式。我們的 社群頁面 充斥著可供參考的資源和可加入的社團。

有關更實用的指南,請瀏覽 How to GraphQL 全端教學網站。我們還有一個與 edX 合作的免費線上課程,探索 GraphQL:API 的查詢語言

在您開始學習之旅之前,請務必了解 什麼是 API,以及客戶端和伺服器之間的通訊通常如何運作。

GraphQL 僅適用於 React 或 JavaScript 開發人員嗎?#

不,完全不是這樣。GraphQL 是一種規範,可以用 任何語言實作。我們的 程式碼頁面 包含許多不同程式語言的函式庫清單,以提供協助。

不過,您會有這樣的想法是可以理解的。GraphQL 是在 React 大會 上推出的,而 GraphQL.js 是迄今最廣泛使用的實作之一。我們知道這可能會令人困惑,因此我們正努力改善我們的文件,並加入更多非 JavaScript 編寫的程式碼範例。

一般

GraphQL 是前端還是後端?#

兩者皆可。GraphQL 說明了如何在用戶端和伺服器之間交換資訊。這包括伺服器如何指出有哪些資料和作業可用、用戶端應如何格式化要求、伺服器應如何執行這些查詢,以及用戶端將收到什麼回應

GraphQL 是否使用 HTTP?#

是的,GraphQL 通常透過 HTTP 提供服務。這在很大程度上是因為 HTTP 協定在我們的產業中非常普遍。但你可以透過建立單一 HTTP 要求來試用 GraphQL,這一點很有幫助。我們的透過 HTTP 提供服務文件提供了設定 GraphQL 伺服器以透過 HTTP 運作的指南。

雖然 HTTP 是用戶端伺服器協定的最常見選擇,但它並非唯一選擇。GraphQL 與傳輸層無關。因此,例如,你可以使用WebSocket來訂閱 GraphQL,而不是使用 HTTP 來使用即時資料。

GraphQL 如何影響我產品的效能?#

在典型的 GraphQL 後端,每個類型的每個欄位都有專注的單一目的函式來解析該值。此外,GraphQL 並未嘗試在用戶端處理資料批次處理,而是將該邏輯移至伺服器。因此,有一些內在的效能優點。將過度擷取減至最少,以及減少往返伺服器的次數就是其中兩項優點。

在建構 GraphQL 實作時,應考慮其他效能因素。例如,GraphQL 服務可能會「話多」,並重複從資料庫載入資料。這通常可透過實作批次處理技術使用 DataLoader 等工具來解決。

什麼是 GraphQL 客户端,我為什麼要使用它?#

GraphQL 客户端可以協助您處理對GraphQL 伺服器查詢、變異訂閱。它們使用 GraphQL API 的底層結構來自動化特定流程。這包括批次處理、UI 更新、建置時間架構驗證等。

我們程式碼頁面上提供了各種語言的 GraphQL 客户端清單。How To GraphQL 中也深入說明了它們的優點

不過,您不需要特定的客户端就能使用 GraphQL。您可能想從使用一般 HTTP 客户端發出 GraphQL 結果開始。然後,隨著應用程式的複雜性增加,再切換到經過 GraphQL 最佳化的客户端。

GraphQL 是否取代了 ORM?#

不,GraphQL 是一種通常用於遠端客戶端伺服器通訊的規範。它與所使用的資料來源無關,而且不會實作物件關聯性對應技術。不過,有專門為 GraphQL 建置的 ORM。其中一些列在我們程式碼頁面的服務區段中。

GraphQL 是 Facebook 所有嗎?#

不,GraphQL 由GraphQL 基金會管理。

話雖如此,此規範最初是在 Facebook 開發,而Facebook 是GraphQL 基金會的成員。您可能會注意到,我們的一些GitHub 儲存庫仍然將授權列在 Facebook Inc. 名下。我們正在更新這些授權,並且已經轉換了主要專案,例如GraphiQLDataLoader,以符合新的版權:「版權所有 (c) 2020 GraphQL 貢獻者」。

GraphQL 背後是誰?#

許多人GraphQL 規範和所有相關專案都是開源的,因此歡迎任何人貢獻。話雖如此,儲存庫背後有一個結構。這是為了解決社群內的衝突並指導技術決策。

GraphQL 基金會為 GraphQL 提供大部分的監督。它是由來自數十家不同公司的代表組成。

GraphQL 基金會也管理著每月虛擬的 GraphQL 工作小組 (WG) 會議。這些會議旨在召集常見 GraphQL 函式庫和工具的維護人員,以及 GraphQL 社群的重要貢獻者。WG 會議完全開放。任何人都可以加入,並 提出議程項目

2020 年 11 月的 WG 會議 中,宣布 GraphQL 將成立技術指導委員會 (TSC)。更多資訊即將公布。

如果這讓你感到困惑,別擔心,有很多事情正在進行中。若要取得更直觀的高階概觀,請查看 GraphQL 景觀

GraphQL 基金會是什麼?#

GraphQL 基金會 是提供 GraphQL 治理的中立基金會。這包括對開源儲存庫、資金、活動等進行與供應商無關的監督。它由 Linux 基金會 託管,並由 來自數十家不同公司的代表 組成。其理念是為 GraphQL 社群提供一個公正開放的家園。

您可以透過造訪 foundation.graphql.org 了解更多資訊。

最佳實務

GraphQL 是否可擴充?#

是的,GraphQL 被設計為可擴充的,並且在許多公司中用於極高的負載下進行生產。

GraphQL 附帶一些 內建效能提升,這些提升可能有所幫助。但是,一旦您將其推送到生產環境,您就有責任跨執行個體擴充它並監控效能。

GraphQL 是否支援離線使用?#

否,或至少不是原生支援。但有一些 GraphQL 客户端 可以讓您優先建立離線功能。它們使用專門設計用於在離線時執行資料操作的功能,例如快取和服務工作人員。

您可以在我們的 程式碼頁面 上找到各種語言的 GraphQL 客户端清單。

GraphQL 有哪些安全性疑慮?#

與 GraphQL 相關的大部分安全性疑慮都適用於任何 API 或服務。以下列舉幾個範例:SQL 注入、拒絕服務 (DoS) 攻擊,或有人濫用有缺陷的驗證。但 GraphQL 也有某些特定的攻擊。例如,批次攻擊。這些攻擊會發生,因為 GraphQL 允許您在單一網路呼叫中批次處理多個查詢(或多個物件實例的請求)。

無論疑慮為何,主動出擊都很重要。有許多方法可以保護您的 GraphQL 伺服器。使用逾時、設定查詢的最大深度,以及根據伺服器完成所需時間來限制查詢,都是可能的解決方法。

有關常見安全性問題及其處理方式的概述,請查看 GraphQL 如何操作教學中的安全性OWASP 的 GraphQL 參考資訊

如何使用 GraphQL 設定授權?#

我們建議在 商業邏輯層 中強制執行授權行為。這樣,您對授權就只有一個真實來源。

有關更詳細的說明,請前往我們的 授權文件

GraphQL 如何與驗證搭配使用?#

您可以使用常見模式實作驗證,例如 OAuthJWT。GraphQL 規範中沒有任何關於驗證的特殊事項。

部分 GraphQL 函式庫 也包含驗證的特定協定。不過,如果您使用的是管線模式,我們建議 將 GraphQL 放在所有驗證中介軟體之後

如果您使用 GraphQL.js 建立您的 API 伺服器,我們有關於 使用 Express 中介軟體處理驗證 的文件。

GraphQL 是否適合用於設計微服務架構?#

是的,可以。如果您將 GraphQL 整合到您的微服務架構中,我們建議將一個 GraphQL 架構作為 API 閘道,而不是讓您的客戶端與多個 GraphQL 服務對話。這樣,您可以將您的後端拆分為微服務,但仍然可以從單一 API 將所有資料彙總到前端。

建立 API 閘道的途徑有很多種。使用 GraphQL 的好處是,你可以利用快取、請求預算和規劃查詢排程等功能。

GraphQL 中的版本控管如何運作?#

沒有任何因素會阻止 GraphQL 服務像其他 REST API 一樣進行版本控管。話雖如此,GraphQL 避免在設計上進行版本控管。

相反地,GraphQL 提供工具來持續建置和演進你的架構。例如,GraphQL 只會傳回明確要求的資料。這表示你可以新增新功能(以及所有相關的類型和欄位),而不會造成重大變更或使現有查詢的結果過於龐大。

你可以在我們的最佳實務範例區段中,進一步了解 GraphQL 中的版本控管運作方式

我該如何記錄我的 GraphQL API?#

GraphQL 的好處之一在於它具有內建文件。這表示當你使用 GraphiQL 等互動式工具時,你可以探索你的 GraphQL API 揭露哪些資料。這包括 欄位類型 等。你也可以新增 說明欄位,提供關於你的端點的補充說明。此說明欄位支援字串和 Markdown。

對許多人來說,這提供了足夠的 API 參考文件。但它並未減少對其他形式文件的需求。你可能仍需要建立指南,說明一般概念如何與你的特定使用案例結合。

規格

追蹤規格發布的最佳方式是什麼?#

GraphQL 規格的最新工作草稿發布版本可以在 spec.graphql.org/draft 找到。先前版本也可以在與其 發布標籤 相符的永久連結中找到。

每次發布背後的所有流程都是開源的。您可以透過追蹤 graphql-spec 儲存庫中的拉取請求 來監控規格提案。您也可以在 YouTube 上觀看 GraphQL 工作小組過去關於各種提案的討論。

我如何為 GraphQL 規格做出貢獻?#

GraphQL 仍在發展中,非常歡迎貢獻!規格(包括 最新工作草稿)是開源的。 貢獻者指南 可在 GitHub 上找到。

不過,除了規格之外,還有更多參與 GraphQL 的方式。例如,更新 本網站和文件 上的內容。或者為 graphql-jsgraphql-httpGraphiQLGraphQL 基金會 維護的許多其他專案之一做出貢獻。

什麼是 GraphQL 規格會員資格?#

GraphQL 規範和相關參考實作是聯合開發基金會計畫(也是 Linux 基金會家族的一份子)。個人或企業貢獻者免費簽署一份文件,同意他們的貢獻受計畫的開放原始碼授權條款約束。由於這並非 GraphQL 基金會會員資格,因此規範會員並未決定如何編列預算。

若要簽署GraphQL 規範會員資格文件,請針對任何GitHub 上的 GraphQL 儲存庫開啟公關。

如果您的組織使用並受益於 GraphQL,請考慮透過代表您的公司開啟公關並加入 GraphQL 基金會,成為兩者的會員。

訂閱文件在哪裡?#

目前尚未出現在本網站上,但我們正在努力製作中。如果您想協助撰寫訂閱指南,請讓我們知道

目前,規範包含如何撰寫和執行訂閱的詳細資訊。

前端

GraphQL 是否取代了 Redux 或其他狀態管理函式庫?#

否,GraphQL 並非狀態管理函式庫,但它可以減少對狀態管理函式庫的需求。

如 Redux 等狀態管理函式庫的一項優點是,它們可以將 API 回應轉換成應用程式可理解的格式。使用 GraphQL,您可以控制請求哪些資料,而且通常結果會以對用戶友善的方式由圖形設計格式化。因此,此優點已內建其中。許多用戶端函式庫也可拿來管理狀態,並內建快取等功能。您可能還是決定實作狀態管理函式庫,但通常不一定要用它來格式化回應資料。

GraphQL 基金會

GraphQL 基金會做些什麼?#

基金會的主要責任是制定政策和分配預算,以最大化 GraphQL 社群的可持續性。成員參與每月召開一次的管理委員會,並決定如何分配資金。

我成為會員後,資金會流向哪裡?#

GraphQL 基金會的資金完全來自成員的支持。管理委員會制定年度預算,以將會費發揮最大效益回饋社群。基金會分配會員募集資金的方式包括:

  • 提供補助金和贊助給擔任中立角色的核心社群開發人員。
  • 資助核心社群的 IT 基礎架構。
  • 資助基金會和 GraphQL 專案生態系的協調、財務和法律支援計畫。
  • 其他社群和開發人員支援計畫。

GraphQL 基金會預算會隨著社群需求的改變而重新調整。

如何做出決策?#

與其他 Linux 基金會專案一樣,管理委員會透過投票做出決策。每張選票都具有同等權重,且沒有任何成員擁有特別的投票權或特權。章程目前將管理委員會成員限制在 25 人以內。

誰可以加入 GraphQL 基金會?#

GraphQL 基金會會員資格開放給希望支持 GraphQL 生態系的公司。由於 GraphQL 基金會是由 Linux 基金會 託管,因此會員也必須加入 Linux 基金會。

我需要加入基金會才能參與 GraphQL 開發嗎?#

不,基金會會員資格與技術開發社群是分開的。參與 GraphQL 開發是免費的,但你必須簽署 免費的 GraphQL 規範會員協議 才能參與。這兩件事是不同的。

成員加入基金會是為了提供必要的資金,並參與如何使用資金的決策。開發人員加入 GraphQL 規範是為了貢獻想法、程式碼和其他內容。許多公司同時進行這兩件事。

我如何參與技術開發?#

我們非常歡迎您的加入!入門的最佳方式是加入GraphQL 工作小組,該小組每月舉行一次會議。開啟一個公關請求將您自己新增至議程,歡迎您加入。

否則,您可以參與我們的任何其他專案

組織由誰創立?#

GraphQL 基金會由 Apollo、AWS、Butterfly Network、Dgraph Labs、Facebook、Gatsby、GraphZen、Hasura、IBM、Intuit、Neo4j、Novvum、Pipefy、Salsify、Solo.io 和 Thicit 共同創立。

目前有哪些成員?#

您可以在GraphQL 基金會成員頁面上進一步瞭解我們的成員資格。

我們如何加入?#

您可以填寫我們的會員申請表,成為 GraphQL 基金會和 Linux 基金會的會員。