架构
架构字段/指令的版本控制

字段/指令的版本控制

字段和指令可以独立进行版本控制,使用的版本可以通过字段/指令参数 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")
  }
}