![螢幕快照 2018-01-29 上午2.45.30.png](https://i.iter01.com/images/2734ad09935a74b2125b5f72aa6e8ca8a71fd54ae822d70c796b21c52bc5e7ef.png)
GraphQL 既是一種用於 API 的查詢語言也是一個滿足你資料查詢的執行時。 GraphQL 對你的 API 中的資料提供了一套易於理解的完整描述,使得客戶端能夠準確地獲得它需要的資料,而且沒有任何冗餘。
GraphQL 有針對不同語言的服務端實現,以幫助開發人員搭建 GraphQL Server
。
而 gq-loader
是一個 webpack
外掛,你可以認為它一針對前端專案的一種 client
端實現,它的目的是幫助前端開發同學更簡便的呼叫 GraphQL API,它讓前端開發人員在使用 GraphQL 時更加方便,像普通 js
模組一樣輕鬆自如,使前端開發人員能在 js
檔案中通過 import
或 require
匯入 .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-loader
的 extensions
無論配置何值,在 js
中 import
時都不能省略副檔名,此選項僅作用於 .gql
檔案 import
其它 .gql
檔案