一个GraphQL查询是一个字符串,它被发送给一个与数据模式无关的服务器,然后服务器返回JSON数据。GraphQL是强类型的,并避免了版本控制,同时提供了随着数据演进可以轻易改进查询语句的能力。
InfoQ找到了Lee Byron,他在Facebook工作同时也是GraphQL的早期贡献者。
InfoQ:GraphQL已经出现几年了。您能简要介绍一下它的历史和Facebook在进军移动计算的时候GraphQL是如何产生的?
Lee Byron:Facebook最初作为一个网站被深深嵌入到我们原有的技术架构中。直到2012年,信息流都只能请求并从服务器以HTML的形式返回。在将信息流重建为以iOS原生 view的形式进行展示的过程中,我们不得不重新改造这个架构来获得原始数据。
我们重新写了一个系统,它看起来非常像一个传统的基于REST的服务器,但作为iOS开发者发现它使用不便,并且我们看到了通过一个请求加载所有的信息同时使得我们的REST资源保持隔离之间的冲突。
特别是被分享的信息流故事和信息流故事的聚合体(它们本身就可能是被分享的信息流故事和信息流故事的聚合体)迫使我们不得不面对这个问题,使得我们重新思考如何去请求数据。
最终,在弄清楚信息流的原始数据应该如何处理以及确定通过移动网络请求数据的最佳方式的努力中,就产生了GraphQL。
InfoQ:数据在本质上是分层的,同时它也是关系图。GraphQL的中心目标是来表达这种图形关系吗?这种语言的其它目的是什么?
Lee Byron:当然,我们觉得很奇怪,我们的应用程序的服务器代码以对象和关系的形式处理数据,然后以扁平的表格来表示它,后来才通过移动客户端的代码将它变回对象和关系。GraphQL的早期目的 是以清晰和易于使用的目标来暴露服务器的数据。
GraphQL还有其他几个重要的目的。它的设计是为了满足产品和创建它们的开发者的要求,而不是为了模拟一些数据库或满足传输语义。这有助于使GraphQL易于学习和使用,但它没有抽象任何特定数据库或传输方式以允许不同的方式来使用它。它同时也是强静态类型的,这有助于促进各信息设计的规则,并且支持很多类似错误检查、IDE集成和代码生成有趣的工具。
InfoQ:服务器中的数据格式或服务器中的数据存储对GraphQL有没有影响?
Lee Byron:没有。 GraphQL不是像MySQL或Redis这样直接面向数据的接口,而是面向你已经存在的应用代码的接口。你可以把GraphQL看作是为了调用应用服务器上的方法的一些内嵌的RPC。
InfoQ:你毫无顾忌地谈论以产品为中心来帮助UI开发者?REST和JSON是否依然有意义以及不关心UI的中间件开发者如何使用它?
Lee Byron:我认为以产品为中心帮助的不仅仅是用户界面开发。在Facebook,GraphQL在服务器代码中是一个真正强大的力量。JSON肯定还是有意义的,它是GraphQL的主要传输方式。在Facebook,我们构建产品时,GraphQL取代了REST,但是在提供公共API时REST仍然是一个有用的工具。
InfoQ:什么是GraphQL服务器?你能否详细说明一下强类型和GraphQL的路线图。目前缺少什么?
Lee Byron:该GraphQL服务器的代码相对小一点;它负责几件事情。它提供了定义你的类型系统和与服务器代码交互的工具。它接受GraphQL查询并且将验证他们以确保可以安全地和明确地在你的类型系统内运行。然后当然,它会依照你在你的类型系统内定义的代码来执行查询,这些代码可能是处理同步、并行和错误捕获的一些工作。
路线图之前还有两个方面需要解决。第一,需要更好地工具来帮助客户端开发者做一些类似于代码生成和查询管理之类的事情。Relay是我们首要的和最显著的客户端工具。其次,在GraphQL中更好地支持流数据和推送的数据。在Facebook我们一直在探索这些领域并很高兴能够在未来分享我们的成功经验。
InfoQ:除了Facebook,你可以说几家已经在使用GraphQL的公司,以及社区有多强大?什么是Nuclide?开发者应该注意哪些其他的工具?
Lee Byron:GraphQL仍然是一个新兴的技术。我们只在几个月前发布GraphQL的预览版,从那时起,我们已经看到了很多大大小小的公司的兴趣。Red Badger,总部设在英国的顾问公司,在开发金融时报的应用程序时已经使用了GraphQL。 Reindex.io是一个新公司,它将GraphQL作为一种服务提供给开发者。社区不仅仅使用GraphQL,同时也创建它。我们几个月前发布了一款GraphQL的JavaScript版本,自那时以来,社区成员已经建立GraphQL的Ruby、Java、Scala、.NET和Python版本。我很高兴能在这样短的时间有这样的进展情况。
Nuclide是Facebook的开发早期的React Native的IDE,它使用了Github的Atom编辑器。React、Relay和React Native都是非常有趣的工具,它们在产品工程领域提供了新的视角。DataLoader是我们最近发布的另一个工具,它包含了我们在Facebook使用了数年的模式并帮助我们构建了效率很高的GraphQL服务器。
相关推荐
一个ESLint插件,用于根据GraphQL模式检查JavaScript内标记的查询字符串或.graphql文件内的查询。 npm install eslint-plugin-graphql eslint-plugin-graphql内置了四个GraphQL客户端的内置设置: 如果您想使用...
1. **查询构造**:库可能提供了一种方法来方便地构造GraphQL查询字符串,或者通过DSL(领域特定语言)直接在Elixir代码中构建查询。 2. **HTTP请求**:为了与GraphQL服务器通信,客户端需要发送HTTP请求。这个库...
- **GraphQL-JavaScript**:在JavaScript中编写GraphQL查询和突变,通常通过`gql`标签或字符串模板来实现。 3. **学习教程结构**: - 可能包含基础概念介绍、安装指南、快速启动示例、查询和突变的编写方法、类型...
1. **解析器(Parser)**:将GraphQL查询字符串转化为抽象语法树(AST),这是执行查询的基础。 2. **验证器(Validator)**:检查查询是否符合GraphQL语法规则,确保其有效性。 3. **执行器(Executor)**:根据AST...
它像一个编译器一样工作,以内置的Write GraphQL查询作为对象而不是字符串作为对象。这是通过NodeJS(作为Got的包装而创建)对GraphQL查询API的更好实现。 它像编译器一样工作,具有内置的HTTPRequest客户端(Got)...
这是一个程序包,可帮助您在字符串数组之外创建graphql查询操作说明安装npm i graphql-converter使用简单import { gqlBuilder } from "graphql-converter" ;// orconst gqlBuilder = require ( "graphql-converter" ...
然后,你可以构造一个GraphQL查询字符串,其中包含你想要从服务器获取的数据。例如: ```go import ( "github.com/graphql-go/graphql" ) client := graphql.NewClient("http://example.com/graphql") query := `...
`gql`函数是用于定义GraphQL查询的字符串模板,返回的结果会是一个包含数据的对象。 **四、与其他库的集成** `apollo-fetch`也可以与其他库,如`graphql-tag`和`graphql-tools`等配合使用,实现更复杂的逻辑。例如...
graphql查询生成器一个简单但功能强大的graphQL查询生成器信息: 测试: 质量:如果有帮助,请 上测试和 :thumbs_up:安装npm install graphql-query-builder 阿皮const Query = require ( 'graphql-query-builder' )...
2. **解析器**:处理GraphQL查询字符串,将其转化为AST。 3. **执行器**:基于AST执行查询,从数据源获取数据并返回结果。 4. **中间件**:可能包含一些自定义逻辑,比如权限检查、日志记录等。 5. **错误处理**...
包括: gql一个JavaScript模板文字标签,用于将GraphQL查询字符串解析为标准GraphQL AST。 /loader一个webpack加载器,用于预处理查询graphql-tag使用作为对等依赖项,因此,除了安装此模块外,还必须安装graphql ...
- 常见的JavaScript库还包括`graphql-tag`用于解析查询字符串,`graphql-tools`用于构建自定义的GraphQL服务。 4. **查询示例**: - `shopify-graphql-query-examples`可能包含了获取产品列表、单个产品的详细...
4. **发送查询**:创建一个GraphQL查询字符串,然后调用`request`函数: ```javascript const query = ` query { user(id: 1) { name email } } `; request(endpoint, query) .then(data => console.log...
GraphQL Lodash 在...) 查询(必填)-查询字符串或查询AST operationName (可选)-仅当查询包含多个操作时才需要退货{ query: string|object, transform: Function}查询-剥去原始查询@_指令transform-接收respons
这可以避免在运行时解析GraphQL字符串的开销,提高应用的性能。例如,我们可以使用它来将GraphQL查询字符串转换为JavaScript对象,使得在代码中直接操作和验证查询变得更容易。 使用`graphql.macro`的过程大致如下...
2. **查询解析**:接受一个GraphQL查询字符串,返回解析后的AST结构。 3. **执行上下文**:可能需要创建和管理执行上下文,以便在解析后执行查询。 4. **执行查询**:基于解析后的AST执行查询,获取所需数据。 5. **...
GraphQL Kotlin 是一个专门为 Kotlin 开发者设计的框架,它允许开发者用纯代码的方式定义 GraphQL API。这个开源项目致力于简化在 Kotlin 应用程序中集成 GraphQL 的过程,提供了一套全面的工具和库,使得开发更加...
今天我们要讨论的是一个名为"kraph"的工具,它是一个用Kotlin编写的GraphQL请求字符串生成器。 首先,让我们深入了解GraphQL。GraphQL允许客户端指定他们需要哪些数据,以及他们需要多少数据,从而避免了过度或不足...
使用编译GraphQL标记的模板字符串。 动机 在构建时编译GraphQL查询: 减少脚本初始化时间; 和 删除graphql-tag依赖性 从捆绑软件中删除graphql-tag依赖项可以节省大约。 50 KB。 实作 搜索graphql-tag导入并将其...
这意味着你可以使用C#对象来描述你的查询,避免了手动编写GraphQL查询字符串的麻烦,同时减少了语法错误的可能性。 2. **执行查询**:库支持向GraphQL服务器发送请求并接收响应。这通常涉及将构建的查询转换为HTTP...