這兩天 CTO 向我安利了 GraphQL,說現在越來越多的項目在采用 GraphQL 模式開發,對客戶端比較多樣,需求變更比較快的產品很有幫助。
聽人勸吃飽飯,所以我要趕緊學習一下。
什么是 GraphQL
GraphQL 不是一種實現方案,而是一個規范,是 facebook 倡導的一個規范,GraphQL 對 API 中的數據提供了一套易于理解的完整描述,使客戶端能夠準確地獲得它需要的數據,而且沒有任何冗余,也讓 API 更容易地隨著時間推移而演進,還能用于構建強大的開發者工具。
為什么要用 GraphQL
在接口開發的時候,我們經常會面臨這些問題
1. 兼容多平臺導致字段冗余
2. 一個頁面需要多次調用 API 聚合數據
3. 需求經常改動導致接口很難為單一接口精簡邏輯
以前為了解決這個問題,我們通常用下面的方式實現
現在 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,就可以看到下面的界面
總結
通過這個簡單的示例,我們能看到 GraphQL 為我們提供了圖表化的 Query 來讓前端實現按需獲取數據,理論上只要你的業務模型沒有發生變化, 從數據模型不會發生變化, 那么我們就不需要修改后端API。
當然這只是一個簡單的示例,GraphQL 的應用和能解決的問題遠不止于此,要想真正應用于實際項目,還需要更多的學習。