這纔是GraphQL最詳盡的解釋

翻譯:瘋狂的技術宅前端

原文:opensource.com/article/19/…web

未經容許嚴禁轉載sql

GraphQL是一種查詢語言、一種執行引擎和一種規範,它引領開發人員從新思考應該怎樣去構建客戶端和API。編程

圖片來源: JuralMin, CC0. Modified by Jason Baker.

GraphQL 是當今軟件技術領域最大的流行語之一。但它到底是什麼?它是一種像 SQL 這樣的查詢語言嗎?像 JVM 這樣的執行引擎?像 XML 這樣的規範?json

只有回答了以上全部問題,纔是正確答案! GraphQL 是一種查詢語言語法,與編程語言無關的執行引擎,以及不斷髮展的規範。後端

讓咱們深刻了解 GraphQL 是怎樣成爲這些東西的,並探究人們對此感到興奮的緣由。前端工程化

查詢語言

GraphQL 做爲一種查詢語言彷佛是合理的 —— 畢竟其中包含了「QL」這個字眼。可是咱們在查詢什麼呢?下面關於查詢請求和對應的響應的例子可能會對你的理解有所幫助。性能優化

如下用戶查詢:bash

{
 user(id: 4) {
   name
   email
   phoneNumber
 }
}
複製代碼

可能會返回如下 JSON 響應:服務器

{
 "user": {
   "name": "Zach Lendon"
   「email」: 「zach@hydrate.io」
   「phoneNumber」: 「867-5309」
 }
}
複製代碼

假設客戶端程序查詢 user 的詳細信息,而後獲取結果並顯示在屏幕上。做爲一種查詢語言,GraphQL 的核心優點之一是客戶端程序只能請求其所須要的數據,並以一致的形式返回它。

什麼是返回 GraphQL 響應?這就是執行引擎(一般以GraphQL服務器的形式)的用武之地。

執行引擎

GraphQL執行引擎

GraphQL 執行引擎負責處理 GraphQL 查詢並返回 JSON 響應。全部 GraphQL 服務器都由兩個核心組件組成:模式和解析器,這兩個組件分別定義了執行引擎的結構和行爲。

GraphQL schema 是一種自定義類型語言,它公開了 GraphQL 服務器實現容許(有效的)和處理哪些查詢。上面的用戶查詢案例的架構能夠以下所示:

type User {
        name: String
        email: String
        phoneNumber: String
}

type Query {
        user: User
}
複製代碼

這些 schema 定義了返回 user 數據的查詢。客戶端能夠經過 user 查詢請求 user 的全部字段,GraphQL 服務器在響應中僅返回那些字段。經過使用強類型模式,GraphQL 服務器能夠驗證傳入的查詢,以確保它們基於所定義的 schema。

一旦肯定查詢是有效的,則交給 GraphQL 服務器的解析器處理。解析器函數支持每一個 GraphQL 類型的全部字段。user 查詢的解析器以下所示:

Query: {
  user(obj, args, context, info) {
    return context.db.loadUserById(args.id).then(
      userData => new User(userData)
    )
  }
}
複製代碼

雖然上面的例子是由 JavaScript 編寫的,但 GraphQL 服務器能夠用任何一種語言編寫。這是由於 GraphQL 自己也是一種規範!

規範

GraphQL 規範定義了實現 GraphQL 所必須遵循的功能和特性。做爲 Open Web Foundation 最終規範協議下的開放規範(目前只有 OWFa 1.0 ),技術社區有機會審查 GraphQL 的實現必須怎樣作才能符合規範,並幫助制定這種語言的將來。

雖然規範對 GraphQL 的語法的說明很是的具體,例如什麼是有效查詢以及 schema 如何工做,但它沒有規定怎樣對數據進行存儲和 GraphQL 服務器應該用哪一種編程語言實現。這在軟件領域是很是強大並且獨特的 —— 它容許用任何一種編程語言去實現 GraphQL 服務器,而且客戶端可以準確的瞭解它們的功能,由於它們是符合規範的。而且已經有了基於多種編程語言的 GraphQL 服務器實現,不只僅是人們一般認爲的 JavaScript、Java 和 C#,還有 Go、Elixir 和 Haskell 等語言。服務器的實現語言不會成爲障礙 —— 不只有許多語言的實現,並且它們都是開源的。若是你選擇的語言尚未對應的實現,也能夠建立本身的實現。

總結

GraphQL 是一個使人興奮的、相對較新的開源 API。它將查詢語言、執行引擎與開源規範相結合,該規範定義了 GraphQL 實現的外觀和功能。

GraphQL 正在改變構建客戶端和 API 應用的方式。把 GraphQL 做爲本身技術堆棧的一部分,前端開發者能夠自由地查詢他們想要的數據,然後端開發者能夠將客戶端程序的需求與其後端系統架構分離。一些公司一般先構建一個位於其現有後端服務之上的 GraphQL API 「層」,從而開始使用 GraphQL。這使得客戶端程序能夠獲得他們尋求的性能和運營效率,同時容許後端團隊在其系統的 GraphQL 層後面進行「改進」(若是須要的話)。一般這些改進是針對性能優化的,這將有助於確保使用 GraphQL 的程序高效地運行。因爲 GraphQL 提供的抽象能力,系統團隊能夠在繼續遵照 GraphQL API 級別的規範的前提下進行這些改進。

因爲 GraphQL 相對較新,開發人員仍在不斷的尋找更好的使用它的方案。 GraphQL 將如何改變你的開發方式並使你得到成功?只有一種方法——用 GraphQL 去實現一些東西!

歡迎關注前端公衆號:前端先鋒,獲取前端工程化實用工具包。

相關文章
相關標籤/搜索