📜  graphql 不是函数解析代码 - Javascript (1)

📅  最后修改于: 2023-12-03 15:01:03.983000             🧑  作者: Mango

GraphQL 不是函数解析代码 - JavaScript

如果你曾经使用过 GraphQL,你可能已经了解到 GraphQL 查询是通过一个特定的解析器来完成的,而不是通过传统的 JavaScript 函数。这个解析器被称为 GraphQL 解析器(GraphQL parser)。

GraphQL 解析器

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

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 解析器与函数的区别

通过以上的介绍,我们可以知道 GraphQL 解析器与 JavaScript 函数的区别在于解析器是通过 AST 来解析查询语句的,而 JavaScript 函数是通过传递参数与返回值来调用的。

虽然这两者有着不同的实现方式,但它们都为我们提供了便利的工具,帮助我们完成复杂的数据操作。所以,在选择使用 GraphQL 或者 JavaScript 函数时,我们应该根据具体的场景来选取最适合的工具。