#graphql #graphql-parser #query-language #lexer #parser #graphql-schema

graphql-query

超级快速且易于使用的GraphQL查询语言处理

1个稳定版本

1.0.0 2024年5月21日

#570数据库接口

MIT 协议

375KB
9K SLoC

graphql_query

超级快速且易于使用的GraphQL查询语言处理。

graphql_query 库遵循两个目标

  • 支持令人愉悦的GraphQL查询语言的API
  • 在处理GraphQL查询语言AST时非常快速

简而言之,惊喜! graphql_query crate在处理GraphQL的一部分时,并不旨在支持完整的、服务器端的GraphQL执行或GraphQL模式语言。服务器端执行的许多部分都是一次性操作。解析模式和使用它可能是使用参考GraphQL.js实现进行预处理操作。

更难的是优化单个GraphQL请求的处理方式,并使其更容易在易于使用的AST之上编写复杂代码。GraphQL吞吐量对于确保GraphQL不落后于任何其他解决方案至关重要,这些解决方案没有丰富的查询语言。此外,同时拥有易于使用且包含足够原语和实用工具的AST库,同时在构建完整的GraphQL服务器时重视性能,这是一件更难的事情。

因此,这个库专注于仅处理GraphQL查询,用于中间的GraphQL层,这些层在GraphQL客户端和GraphQL服务器之间操作。

了解这个crate的好地方是ast模块...

示例代码

库目前包括解析、打印、验证、访问和转换GraphQL查询语言AST的实用工具。

use graphql_query::{ast::*, validate::*};

let ctx = ASTContext::new();
let ast = Document::parse(&ctx, "{ field }").unwrap();

DefaultRules::validate(&ctx, &ast).unwrap()

let output = ast.print();

性能

这个库在实现这个目标方面进展如何? 正中靶心。

在M1 Macbook Pro上进行的基准测试

解析

test graphql_ast_parse_graphql_query   ... bench:       2,886 ns/iter (+/- 130)
test graphql_ast_parse_graphql_parser  ... bench:      25,122 ns/iter (+/- 1,711)
test graphql_ast_parse_apollo_parser   ... bench:      36,242 ns/iter (+/- 1,062)

打印

test graphql_ast_print_graphql_query  ... bench:       1,082 ns/iter (+/- 79)
test graphql_ast_print_gql_parser     ... bench:       1,137 ns/iter (+/- 48)
test graphql_ast_print_apollo_parser  ... bench:      20,861 ns/iter (+/- 518)

其他

test graphql_ast_fold                 ... bench:       8,466 ns/iter (+/- 768)
test graphql_ast_validate             ... bench:       2,339 ns/iter (+/- 127)
test graphql_load_introspection       ... bench:      90,265 ns/iter (+/- 4,899)

这里没有的东西

  • SDL实现
  • 模式感知的验证规则,但可以通过我们的schema_reference完全实现
  • execute/collectFields算法 - 故意如此,因为我们专注于执行语言

依赖关系

~5.5MB
~62K SLoC