变量与模板文字插值
Variables versus template literal interpolation
在任何情况下您应该在 Apollo 查询中使用 ${foo}
而不是 variables: {foo: foo}
?
TL;DR 不,不要在模板中使用字符串插值。它搞砸了任何可以做的静态分析。
您可以在 GraphQL 查询中使用变量做很多事情!
- 显然,您可以将变量作为参数传递给各个字段
- 您还可以使用@skip and @include directives修改查询中的字段
通过结合这两个工具以及未来可能的其他工具,基本上不需要进行字符串插值。
为什么 GraphQL 查询中的字符串插值不好?好吧,出于某些原因,最好将 GraphQL 查询字符串视为静态对象,而不是要操作的字符串:
- 您可能会不小心对无效查询进行字符串操作。如果您没有正确地转义某些参数,您可能会得到一个 returns 错误的查询或一些您没有预料到的完全不同的数据。变量是 JSON 编码的,因此不需要对它们进行转义。
- 如果您的查询是动态生成的,则无法使用 eslint-plugin-graphql 等工具对其进行静态分析,因此如果没有 运行 您的代码,您无法检查您的查询是否有效.
- 如果查询由许多不同的字符串组成,其他开发人员将更难理解返回数据的形状。如果其中有任意 JavaScript 代码,您也不能将查询复制粘贴到 GraphiQL 之类的东西中以尝试 运行 它。
简而言之,有很多机会可以使用 GraphQL 查询字符串做很酷的事情,但是一旦您开始使用任意代码来操作它们,就会变得更加困难或不可能。所以我的建议是,坚持变量。
在任何情况下您应该在 Apollo 查询中使用 ${foo}
而不是 variables: {foo: foo}
?
TL;DR 不,不要在模板中使用字符串插值。它搞砸了任何可以做的静态分析。
您可以在 GraphQL 查询中使用变量做很多事情!
- 显然,您可以将变量作为参数传递给各个字段
- 您还可以使用@skip and @include directives修改查询中的字段
通过结合这两个工具以及未来可能的其他工具,基本上不需要进行字符串插值。
为什么 GraphQL 查询中的字符串插值不好?好吧,出于某些原因,最好将 GraphQL 查询字符串视为静态对象,而不是要操作的字符串:
- 您可能会不小心对无效查询进行字符串操作。如果您没有正确地转义某些参数,您可能会得到一个 returns 错误的查询或一些您没有预料到的完全不同的数据。变量是 JSON 编码的,因此不需要对它们进行转义。
- 如果您的查询是动态生成的,则无法使用 eslint-plugin-graphql 等工具对其进行静态分析,因此如果没有 运行 您的代码,您无法检查您的查询是否有效.
- 如果查询由许多不同的字符串组成,其他开发人员将更难理解返回数据的形状。如果其中有任意 JavaScript 代码,您也不能将查询复制粘贴到 GraphiQL 之类的东西中以尝试 运行 它。
简而言之,有很多机会可以使用 GraphQL 查询字符串做很酷的事情,但是一旦您开始使用任意代码来操作它们,就会变得更加困难或不可能。所以我的建议是,坚持变量。