架构字段/指令的版本控制
字段/指令的版本控制
字段和指令可以独立进行版本控制,使用的版本可以通过字段/指令参数 versionConstraint 在 query 中指定。
为了选择字段/指令的版本,Gato GraphQL 使用与 Composer 所采用的相同的 semver 版本约束。
为什么需要版本控制
GraphQL 所采用的演进策略存在一个问题:当废弃一个字段(以便用新实现替换它)时,新字段将需要一个新的字段名称。然后,如果废弃的字段无法被移除(例如,因为某些客户端仍在访问它,来自从未被修订的 query),那么同一功能的所有这些字段就会在 schema 中不断积累,而新实现的字段将无法拥有一个最优的名称(事实上,它会比废弃字段的名称更差)。
单靠演进策略,随着时间推移,schema 往往会被不必要的定义所污染。在字段/指令级别对 schema 进行版本控制可以解决这个问题。
通过 query 指定目标版本
通过参数 versionConstraint 将约束传递给字段或指令:
# Selecting version for fields
query {
#This will produce version 0.1.0
firstVersion: userServiceURLs(versionConstraint: "^0.1")
# This will produce version 0.2.0
secondVersion: userServiceURLs(versionConstraint: ">0.1")
# This will produce version 0.2.0
thirdVersion: userServiceURLs(versionConstraint: "^0.2")
}
# Selecting version for directives
query {
post(by: { id:1 }) {
titleCase: title @makeTitle(versionConstraint: "^0.1")
upperCase: title @makeTitle(versionConstraint: "^0.2")
}
}