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
的用法及行为彻底一致。jquery
关注或使用 gq-loader,请访问 GitHub:github.com/Houfeng/gq-…webpack
想更多的了解或使用 GraphQL,请移步 github.com/facebook/gr…git
npm install gq-loader --save-dev
复制代码
或者github
yarn add gq-loader
复制代码
如同其它 loader 同样,首先,咱们在 webpack.config.js
中添加 gq-loader
的配置web
{
test: /\.(graphql|gql)$/,
exclude: /node_modules/,
use: {
loader: 'gq-loader'
options: {
url: 'Graphql Server URL'
}
}
}
复制代码
而后,咱们就能够在 js
文件中经过 import
来导入 .gql
文件使用它了,咱们来一个简单的示例,假设已经有一个能够工做的 Graphql Server
,那么,咱们先建立一个能够查询用户的 getUser.gql
npm
#import './fragment.gql'
query MyQuery($name: String) {
getUser(name: $name)
...userFields
}
}
复制代码
能够看到,咱们经过 #import
引用了另一个 .gql
文件 fragment.gql
,在这个文件中咱们描术了要返回的 user 的字段信息,这样咱们就能在不一样的地方「重用」它了,咱们也建立一下这个文件bash
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
文件