GraphQL 既是一種用於 API 的查詢語言也是一個知足你數據查詢的運行時。 GraphQL 對你的 API 中的數據提供了一套易於理解的完整描述,使得客戶端可以準確地得到它須要的數據,並且沒有任何冗餘。前端
GraphQL 有針對不一樣語言的服務端實現,以幫助開發人員搭建 GraphQL Server
。node
而 gq-loader
是一個 webpack
插件,你能夠認爲它一針對前端項目的一種 client
端實現,它的目的是幫助前端開發同窗更簡便的調用 GraphQL API,它讓前端開發人員在使用 GraphQL 時更加方便,像普通 js
模塊同樣輕鬆自如,使前端開發人員能在 js
文件中經過 import
或 require
導入 .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.gql
web
#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-loader
的 extensions
不管配置何值,在 js
中 import
時都不能省略擴展名,此選項僅做用於 .gql
文件 import
其它 .gql
文件