前端呼叫 GraphQL API,從未如此方便!

阿里雲前端發表於2018-01-30

螢幕快照 2018-01-29 上午2.45.30.png

GraphQL 既是一種用於 API 的查詢語言也是一個滿足你資料查詢的執行時。 GraphQL 對你的 API 中的資料提供了一套易於理解的完整描述,使得客戶端能夠準確地獲得它需要的資料,而且沒有任何冗餘。

GraphQL 有針對不同語言的服務端實現,以幫助開發人員搭建 GraphQL Server

gq-loader 是一個 webpack 外掛,你可以認為它一針對前端專案的一種 client 端實現,它的目的是幫助前端開發同學更簡便的呼叫 GraphQL API,它讓前端開發人員在使用 GraphQL 時更加方便,像普通 js 模組一樣輕鬆自如,使前端開發人員能在 js 檔案中通過 importrequire 匯入 .gql.graphql 檔案,然後直接呼叫。 並且它還支援通過 #import 語法匯入其它 .gql 檔案,比如 fragments。

#import 還提供了兩個別名,分別是 #require#include,這兩個別名和 #import 的用法及行為完全一致。

關注或使用 gq-loader,請訪問 GitHub:github.com/Houfeng/gq-…

想更多的瞭解或使用 GraphQL,請移步 github.com/facebook/gr…

安裝

npm install gq-loader --save-dev
複製程式碼

或者

yarn add gq-loader
複製程式碼

基本使用

如同其它 loader 一樣,首先,我們在 webpack.config.js 中新增 gq-loader 的配置

{
  test: /\.(graphql|gql)$/,
  exclude: /node_modules/,
  use: {
    loader: 'gq-loader'
    options: {
      url: 'Graphql Server URL'
    }
  }
}
複製程式碼

然後,我們就可以在 js 檔案中通過 import 來匯入 .gql 檔案使用它了,我們來一個簡單的示例,假設已經有一個可以工作的 Graphql Server,那麼,我們先建立一個可以查詢使用者的 getUser.gql

#import './fragment.gql' 

query MyQuery($name: String) {
  getUser(name: $name)
    ...userFields
  }
}
複製程式碼

可以看到,我們通過 #import 引用了另外一個 .gql 檔案 fragment.gql,在這個檔案中我們描術了要返回的 user 的欄位資訊,這樣我們就能在不同的地方「重用」它了,我們也建立一下這個檔案

fragment userFields on User {
  name
  age
}
複製程式碼

好了,我們可以在 js 檔案中直接匯入 getUser.gql,並且使用它查詢使用者了,從未如此簡便,我們來看看

import getUser from './getUser.gql';
import React from 'react';
import ReactDOM from 'react-dom';

async function query() {
  const user = await getUser({ name: 'bob' });
  console.log('user', user);
}

function App() {
  return <button onClick={query}>click</button>;
}

ReactDOM.render(<App />, document.getElementById('root'));
複製程式碼

在呼叫 getUser 時,我們可以給函式引數向 GraphQL 傳遞變數,這些變數就是我們的查詢引數。

自定義請求

預設 gq-loader 就會幫你完成 graphql 請求,但某些場景下或許你想自已控制所有請求,如果有這樣需要,我們還可以通過 request 屬性來「自定義」請求,看一下示例,需要先稍微改動一下 loader 配置

{
  test: /\.(graphql|gql)$/,
  exclude: /node_modules/,
  use: {
    loader: 'gq-loader'
    options: {
      url: 'Graphql Server URL',
      //指定自動請求模組路徑
      request: require.resolve('your_request_module_path');
    }
  }
}
複製程式碼

your_request_module_path 填寫自定義請求模組路徑,gq-loader 將自動載入並使用對應請求模組,模組只需要改出一個「請求函式即可」,看如下自定義示例

const $ = require('jquery');

//url 是要請求的 GraphQL 服務地址
//data 是待傳送的資料
//options 是自定義選項
module.exports = function(url, data, options){
  //如果有需要還可以處理 options
  return $.post(url, data);
};
複製程式碼

其中,options 是匯入 .gql 檔案後「函式的第二個引數」,比如,可以這樣傳遞 options 引數

import getUser from './getUser.gql';

async function query() {
  const options = {...};
  const user = await getUser({ name: 'bob' }, options);
  console.log('user', user);
}
複製程式碼

完整選項

名稱 說明 預設值
URL 指定 graphql 服務 URL /graphql
request 自定義請求函式 使用內建模組
extensions 預設副檔名,在匯入時省略副檔名時將按配置依次查詢 .gql/.graphql
string 指定匯入模式,當為 true 時匯入為字串,而不是可執行的函式 false

注意,gq-loaderextensions 無論配置何值,在 jsimport 時都不能省略副檔名,此選項僅作用於 .gql 檔案 import 其它 .gql 檔案

相關文章