前端調用 GraphQL API,從未如此方便!

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

GraphQL 既是一種用於 API 的查詢語言也是一個知足你數據查詢的運行時。 GraphQL 對你的 API 中的數據提供了一套易於理解的完整描述,使得客戶端可以準確地得到它須要的數據,並且沒有任何冗餘。前端

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

gq-loader 是一個 webpack 插件,你能夠認爲它一針對前端項目的一種 client 端實現,它的目的是幫助前端開發同窗更簡便的調用 GraphQL API,它讓前端開發人員在使用 GraphQL 時更加方便,像普通 js 模塊同樣輕鬆自如,使前端開發人員能在 js 文件中經過 importrequire 導入 .gql.graphql 文件,而後直接調用。 而且它還支持經過 #import 語法導入其它 .gql 文件,好比 fragments。react

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

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

想更多的瞭解或使用 GraphQL,請移步 https://github.com/facebook/graphqlwebpack

安裝

npm install gq-loader --save-dev

或者git

yarn add gq-loader

基本使用

如同其它 loader 同樣,首先,咱們在 webpack.config.js 中添加 gq-loader 的配置github

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

而後,咱們就能夠在 js 文件中經過 import 來導入 .gql 文件使用它了,咱們來一個簡單的示例,假設已經有一個能夠工做的 Graphql Server,那麼,咱們先建立一個能夠查詢用戶的 getUser.gqlweb

#import './fragment.gql' 

query MyQuery($name: String) {
  getUser(name: $name)
    ...userFields
  }
}

能夠看到,咱們經過 #import 引用了另一個 .gql 文件 fragment.gql,在這個文件中咱們描術了要返回的 user 的字段信息,這樣咱們就能在不一樣的地方「重用」它了,咱們也建立一下這個文件npm

fragment userFields on User {
  name
  age
}

好了,咱們能夠在 js 文件中直接導入 getUser.gql,而且使用它查詢用戶了,從未如此簡便,咱們來看看dom

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 文件

相關文章
相關標籤/搜索