跳至主要内容

Relay v15.0

·阅读时长 4 分钟

Relay 团队很高兴宣布发布 Relay v15。虽然此版本是主要的版本升级,并且包含一些重大更改,但我们预计大多数用户不会受到影响,并且将体验到无缝升级。您可以在v15 版本说明中找到完整的更改列表。

Relay 15 的新功能?

支持在接口上使用 @refetchable

之前无法在服务器接口类型的片段定义上添加 @refetchable 指令。

// schema.graphql

interface RefetchableInterfaceFoo @fetchable(field_name: "id") {
id: ID!
}

extend type Query {
fetch__RefetchableInterfaceFoo(id: ID!): RefetchableInterfaceFoo
}

// fragment

fragment RefetchableFragmentFoo on RefetchableInterfaceFoo
@refetchable(queryName: "RefetchableFragmentFooQuery") {
id
}

持久化查询改进

如果您使用基于 URL 的持久化查询,现在可以指定自定义标头以与持久化查询的请求一起发送。例如,这可以用于将身份验证标头发送到您的查询持久化 URL 端点。

persistConfig: {
url: 'example.com/persist',
headers: {
Authorization: 'bearer TOKEN'
}
}

对于基于文件的持久化查询,我们添加了一个新的功能标志 compact_query_text,它会从持久化查询文本中删除所有空格。这可以让文件缩小 60% 以上。此新功能标志可以在您的 Relay 配置文件中启用。

persistConfig: {
file: 'path/to/file.json',
algorithm: 'SHA256'
},
featureFlags: {
compact_query_text: true
}

类型安全的更新现在支持缺失的字段处理程序

类型安全的更新程序现在支持缺失的字段处理程序。之前,如果您在类型安全的更新程序中选择了 node(id: 4) { ... on User { name, __typename } },但该用户是以其他方式获取的(例如,使用 best_friend { name }),那么您将无法使用类型安全的更新程序访问和变异该用户。

在此版本中,我们在类型安全的更新程序中添加了对缺失的字段处理程序的支持,这意味着如果为节点设置了缺失的字段处理程序(如此示例所示),您将能够使用此缺失的字段处理程序更新用户的姓名。

为了支持这一点,缺失的字段处理程序的签名已更改。处理程序用于接收 Record 类型的 record 参数(它是一个未类型化的数据集合)。它现在接收 ReadOnlyRecordProxy。此外,NormalizationLinkedField 类型的字段参数现在是 CommonLinkedField,它是一个包含 ReaderLinkedFieldNormalizationLinkedField 中找到的属性的类型。

Flow 类型改进

Flow 用户现在将从更多 Relay API 中的 graphql 字面量推断出类型。Flow 用户不再需要显式地为 usePreloadedQueryuseQueryLoaderuseRefetchableFragmentusePaginationFragmentuseBlockingPaginationFragment API 方法的返回值指定类型。

Relay Resolver 改进

自上次发布以来,我们开发工作的大部分都投入到改进Relay Resolvers(一种在图中公开派生数据的机制)。值得注意的是,Relay Resolvers 仍处于实验阶段,API 可能会在将来发生更改。

更简洁的 docblock 标签

Relay Resolver 函数的注释已简化。在许多情况下,您现在可以使用 ParentType.field_name: ReturnType 语法来定义 Relay Resolver 公开的新的字段。

之前

/**
* @RelayResolver
* @onType User
* @fieldName favorite_page
* @rootFragment myRootFragment
*/

之后

/**
* @RelayResolver User.favorite_page: Page
* @rootFragment myRootFragment
*/

在上面的示例中,Page 类型是架构类型。如果您的 Relay Resolver 不返回架构类型,您可以使用固定的 RelayResolverValue 值作为您的返回类型

/**
* @RelayResolver User.best_friend: RelayResolverValue
* @rootFragment myRootFragment
*/

为每个文件定义多个解析器

在此版本之前,我们只允许每个文件一个 Relay Resolver,并要求 Relay Resolver 函数是默认导出。在 Relay 15 中,您现在可以为每个文件定义多个 Relay Resolvers 并使用命名导出。

/**
* @RelayResolver User.favorite_page: Page
* @rootFragment favoritePageFragment
*/
function usersFavoritePage(){
...
}

/**
* @RelayResolver User.best_friend: RelayResolverValue
* @rootFragment bestFriendFragment
*/
function usersBestFriend(){
...
}

module.exports = {
usersFavoritePage,
usersBestFriend
}

快乐查询!