前端調用 GraphQL API,從未如此方便!
The best GraphQL Loader for Webpack
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:https://github.com/Houfeng/gq-loader
想更多的了解或使用 GraphQL,請移步 https://github.com/facebook/graphql
安裝
npm install gq-loader --save-devn
或者
yarn add gq-loadern
基本使用
如同其它 loader 一樣,首先,我們在 webpack.config.js
中添加 gq-loader
的配置
{n test: /.(graphql|gql)$/,n exclude: /node_modules/,n use: {n loader: gq-loadern options: {n url: Graphql Server URLn }n }n}n
然後,我們就可以在 js
文件中通過 import
來導入 .gql
文件使用它了,我們來一個簡單的示例,假設已經有一個可以工作的 Graphql Server
,那麼,我們先創建一個可以查詢用戶的 getUser.gql
#import ./fragment.gql nnquery MyQuery($name: String) {n getUser(name: $name)n ...userFieldsn }n}n
可以看到,我們通過 #import
引用了另外一個 .gql
文件 fragment.gql
,在這個文件中我們描術了要返回的 user 的欄位信息,這樣我們就能在不同的地方「重用」它了,我們也創建一下這個文件
fragment userFields on User {n namen agen}n
好了,我們可以在 js
文件中直接導入 getUser.gql
,並且使用它查詢用戶了,從未如此簡便,我們來看看
import getUser from ./getUser.gql;nimport React from react;nimport ReactDOM from react-dom;nnasync function query() {n const user = await getUser({ name: bob });n console.log(user, user);n}nnfunction App() {n return <button onClick={query}>click</button>;n}nnReactDOM.render(<App />, document.getElementById(root));n
在調用 getUser
時,我們可以通過函數參數向 GraphQL
傳遞變數,這些變數就是我們的查詢參數。
自定義請求
默認 gq-loader
就會幫你完成 graphql 請求
,但某些場景下或許你想自已控制所有請求,如果有這樣需要,我們還可以通過 request
屬性來「自定義」請求,看一下示例,需要先稍微改動一下 loader 配置
{n test: /.(graphql|gql)$/,n exclude: /node_modules/,n use: {n loader: gq-loadern options: {n url: Graphql Server URL,n //指定自動請求模塊路徑n request: require.resolve(your_request_module_path);n }n }n}n
在 your_request_module_path
填寫自定義請求模塊路徑,gq-loader
將自動載入並使用對應請求模塊,模塊只需要改出一個「請求函數即可」,看如下自定義示例
const $ = require(jquery);nn//url 是要請求的 GraphQL 服務地址n//data 是待發送的數據n//options 是自定義選項nmodule.exports = function(url, data, options){n //如果有需要還可以處理 optionsn return $.post(url, data);n};n
其中,options
是導入 .gql
文件後「函數的第二個參數」,比如,可以這樣傳遞 options
參數
import getUser from ./getUser.gql;nnasync function query() {n const options = {...};n const user = await getUser({ name: bob }, options);n console.log(user, user);n}n
完整選項
- url:指定 graphql 服務 URL ,默認值為 /graphql
- request:自定義請求函數,默認值為「使用內建模塊」
- extensions:默認擴展名,在導入時省略擴展名時將按配置依次查找,默認值為 .gql/.graphql,
- string:指定導入模式,當為 true 時導入的為字元串,而不是可執行的函數
注意,gq-loader
的 extensions
無論配置何值,在 js
中 import
時都不能省略擴展名,此選項僅作用於 .gql
文件 import
其它 .gql
文件
推薦閱讀: