GraphQL 學習分享

這兩天 CTO 向我安利了 GraphQL,說現在越來越多的項目在采用 GraphQL 模式開發,對客戶端比較多樣,需求變更比較快的產品很有幫助。

聽人勸吃飽飯,所以我要趕緊學習一下。

什么是 GraphQL

GraphQL 不是一種實現方案,而是一個規范,是 facebook 倡導的一個規范,GraphQL 對 API 中的數據提供了一套易于理解的完整描述,使客戶端能夠準確地獲得它需要的數據,而且沒有任何冗余,也讓 API 更容易地隨著時間推移而演進,還能用于構建強大的開發者工具。

為什么要用 GraphQL

在接口開發的時候,我們經常會面臨這些問題

1. 兼容多平臺導致字段冗余
2. 一個頁面需要多次調用 API 聚合數據
3. 需求經常改動導致接口很難為單一接口精簡邏輯

以前為了解決這個問題,我們通常用下面的方式實現

提供多個接口
增加參數來實現

現在 GraphQL 可以讓我們用更優雅的方式來實現

GraphQL 處理流程

如何實現? GraphQL

GraphQL 作為一種規范,已經有很多的技術框架可以快速實現,不論是 Java 、PHP 還是 JS。
作為前端開發,我自然首選 NodeJS + Express + Apollo GraphQL 來實現了

首先安裝依賴包

npm install apollo-server-express
npm install graphal

然后添加引用,這里要特別注意,apollo-graphql 1.0 和 2.0 實現方式差異很大,網上的資料大部分都是基于 1.x 版本,我們默認安裝的是最新版本,舊版實現方法會出錯

var { ApolloServer, gql } = require('apollo-server-express');

聲明 typeDefs,typeDefs 用來定義你的數據描述,描述決定了你可以如何通過請求獲取數據
typeDefs 中有兩個保留類型 Query / Mutation,這兩個類型是 GraphQL 支持的兩種請求(事實上還有第三種 subscriptions?,但是不常用),Query 用于查詢,Mutation 用于更新,類比 PUT / DELETE?

var typeDefs = gql`
? type Book {
? ? ?title: String
? ? ?author: String
? }
? type Query {
? ? books(id: Int): [Book]
? }
? type Mutation {
? ? add(title: String, author: String): Int
? }
? schema {
? ? query: Query
? ? mutation: Mutation
? }`;

然后再聲明 resolvers,resolvers 是解析器,定義了 query / mutation 的具體實現

var resolvers = {
? Query: {
? ? books: function (parent, args, context, info) {
? ? ? return books;
? ? }
? },
? Mutation: {
? ? add: function (root, args, context) {
? ? ? //? ? 這里是執行插入數據的方法
? ? ? return 0; // 0 表示成功
? ? }
? }
};

最后再注冊服務

var server = new ApolloServer({ typeDefs, resolvers });
server.applyMiddleware({
? app: express(),
? path: '/graphql'
});

現在啟動服務后,在瀏覽器中打開 http://localhost:{你的端口號}/graphql,就可以看到下面的界面


執行 query 請求查詢 books


執行 mutation 請求添加 book

總結

通過這個簡單的示例,我們能看到 GraphQL 為我們提供了圖表化的 Query 來讓前端實現按需獲取數據,理論上只要你的業務模型沒有發生變化, 從數據模型不會發生變化, 那么我們就不需要修改后端API。

當然這只是一個簡單的示例,GraphQL 的應用和能解決的問題遠不止于此,要想真正應用于實際項目,還需要更多的學習。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容