#graphql #cache #web #async #query-builder

artemis

一个集成的支持缓存、获取等功能的GraphQL客户端,通过Rust和WASM的可扩展交换实现

3个版本

0.1.0 2021年3月6日
0.1.0-alpha.12020年4月26日
0.1.0-alpha.02020年4月9日

#268HTTP客户端


用于 2 个包

MIT/Apache

94KB
1.5K SLoC

artemis

一个现代的GraphQL客户端,内置常见功能,并通过交换扩展其功能

入门

此包需要两个依赖项
你的常规依赖项中的主要包,以及 artemis-build 在你的 dev-dependencies 中。

第一步是在 .graphql 文件中编写一些查询,然后将以下内容添加到你的 build.rs 中(如有必要,请创建它)

use artemis_build::CodegenBuilder;

fn main() {
    CodegenBuilder::new()
        .introspect_schema("https://127.0.0.1:8080/graphql", None, Vec::new())
        .unwrap()
        .add_query("queries/x.graphql")
        .with_out_dir("src/queries")
        .build()
        .unwrap();
}

之后,你可以在应用程序中使用该包,如下所示

use artemis::Client;
use artemis_test::get_conference::{GetConference, get_conference::Variables};

let client = Client::builder("https://127.0.0.1:8080/graphql")
    .with_default_exchanges()
    .build();

let result = client.query(GetConference, Variables { id: "1".to_string() }).await.unwrap();
assert!(result.data.is_some());

有关更多信息,请参阅相关方法和结构体文档。

构建

此包使用代码生成,将你的GraphQL文件转换为强类型Rust模块。这些模块包含查询结构体,如零大小的类型GetConference,以及包含Variables、任何输入类型、ResponseData类型和任何相关输出类型的子模块。

具有强类型编译时表示以及额外信息(例如,所有相关类型的__typename和抽象选择树)意味着CPU在运行时所需的工作非常少,仅涉及序列化、反序列化和使用静态生成数据的简单查找。

有关如何使用查询构建器的详细信息,请参阅 artemis-build

交换

交换类似于双向中间件。它们作用于传入和传出的查询,如果无法返回结果,则将它们传递下去。

有三个默认交换,按以下顺序调用

去重交换

去重交换(DedupExchange)通过将多个相同的查询合并为一个来过滤掉不必要的查询。它是通过跟踪正在进行的查询来完成的,而不是触发另一个相同的查询,而是等待其结果。这减少了网络流量,尤其是在较大的应用程序中,同一查询可能在多个地方使用,并且可能同时多次运行。

缓存交换

缓存交换是一个非常基本的未归一化缓存,它会积极使查询失效。它关注简洁性和数据正确性,因此如果一个查询使用了与突变相同的任何类型,它将始终被它使失效。这意味着,尤其是如果你有大量相同类型的不同实体,这可能会迅速变得昂贵。对于一种更高级的归一化缓存,它只使直接相关实体失效,请参阅 artemis-normalized-cache 包。

FetchExchange

fetch交换会将查询序列化,通过网络发送,并反序列化响应。这在x86上使用reqwest,如果你使用WASM,则使用fetch。这应该是链中的最后一个交换,因为它从不转发查询。

WASM

WASM支持需要在你的代码中做一些小的样板代码。首先,在你的查询中有一个wasm模块,它包含一个自动生成的枚举,包含所有你的查询。这用于在WASM边界传输类型数据。

其次,你必须使用wasm_client! 宏来生成一个WASM互操作客户端,该客户端为你的查询具有硬编码的类型,再次消除不受支持的泛型和在边界传输类型数据。传递给宏的查询类型必须是上述提到的枚举生成的。

JavaScript类型和方法的文档可以在构建WASM时输出的TypeScript定义中找到。

功能

  • default-exchanges (默认) - 包含默认交换和相关构建方法
  • observable (默认) - 包含对可观察的以及所有相关类型的支持。包括x86上的tokio

依赖项

~4–10MB
~209K SLoC