📅  最后修改于: 2023-12-03 15:01:03.983000             🧑  作者: Mango
如果你曾经使用过 GraphQL,你可能已经了解到 GraphQL 查询是通过一个特定的解析器来完成的,而不是通过传统的 JavaScript 函数。这个解析器被称为 GraphQL 解析器(GraphQL parser)。
GraphQL 解析器是通过一个专门的程序来解析 GraphQL 查询的,它会将查询语句转化为一种称为 AST 的数据结构(抽象语法树,abstract syntax tree)。
const { parse } = require('graphql/language/parser');
const query = `
query {
user(id: 1) {
firstName
lastName
email
}
}
`;
const ast = parse(query);
console.log(ast);
这段代码中,我们使用了 graphql/language/parser
模块中提供的 parse
方法来解析 GraphQL 查询,最终得到了一个 AST。
AST 是一个用来描述代码结构的数据结构。在 GraphQL 中,AST 表示的是一个 GraphQL 查询语句,它由许多节点组成,这些节点可以是字段、变量、操作、指令等等。
每一个节点都是一个 JavaScript 对象,它包含一些元数据,比如它的类型、位置信息以及子节点等等。这些元数据可以被用来处理这个节点,比如对这个节点进行遍历、转换、修改等等。
{
kind: 'Document',
loc: { start: 0, end: 74 },
definitions: [
{
kind: 'OperationDefinition',
loc: { start: 2, end: 73 },
operation: 'query',
name: null,
variableDefinitions: [],
directives: [],
selectionSet: {
kind: 'SelectionSet',
loc: { start: 9, end: 73 },
selections: [
{
kind: 'Field',
loc: { start: 13, end: 71 },
alias: null,
name: { kind: 'Name', loc: { start: 13, end: 17 }, value: 'user' },
arguments: [
{
kind: 'Argument',
loc: { start: 18, end: 25 },
name: { kind: 'Name', loc: { start: 18, end: 20 }, value: 'id' },
value: { kind: 'IntValue', loc: { start: 22, end: 23 }, value: '1' }
}
],
directives: [],
selectionSet: {
kind: 'SelectionSet',
loc: { start: 27, end: 71 },
selections: [
{
kind: 'Field',
loc: { start: 33, end: 44 },
alias: null,
name: { kind: 'Name', loc: { start: 33, end: 42 }, value: 'firstName' },
arguments: [],
directives: []
},
{
kind: 'Field',
loc: { start: 46, end: 57 },
alias: null,
name: { kind: 'Name', loc: { start: 46, end: 55 }, value: 'lastName' },
arguments: [],
directives: []
},
{
kind: 'Field',
loc: { start: 59, end: 67 },
alias: null,
name: { kind: 'Name', loc: { start: 59, end: 64 }, value: 'email' },
arguments: [],
directives: []
}
]
}
}
]
}
}
],
...
}
在这个 AST 中,我们可以看到整个 GraphQL 查询语句的结构。
通过以上的介绍,我们可以知道 GraphQL 解析器与 JavaScript 函数的区别在于解析器是通过 AST 来解析查询语句的,而 JavaScript 函数是通过传递参数与返回值来调用的。
虽然这两者有着不同的实现方式,但它们都为我们提供了便利的工具,帮助我们完成复杂的数据操作。所以,在选择使用 GraphQL 或者 JavaScript 函数时,我们应该根据具体的场景来选取最适合的工具。