书海网短评:
为什么GraphQL是Ajax诞生以来创新性的数据获取技术?GraphQL通过为API提供查询语言和用以完成查询的运行状态,提供了对REST和特定页面服务架构的替代方案。借助这本书,AlexBanks和EvePorcello
为什么GraphQL是Ajax诞生以来创新性的数据获取技术?GraphQL通过为API提供查询语言和用以完成查询的运行状态,提供了对REST和特定页面服务架构的替代方案。借助这《GraphQL学习指南》,AlexBanks和EvePorcello为希望开始使用GraphQL的前端Web开发人员、后端工程师以及项目或产品经理提供了一条清晰的学习路径。
你将先后探索图论、图数据结构和GraphQL类型,之后在实际项目中学习如何为照片共享应用构建schema。《GraphQL学习指南》还将向你介绍ApolloClient,可用来将GraphQL连接到你的用户界面。
·探索图论并回顾当今使用的家喻户晓的图形实例
·了解GraphQL如何将数据库查询方法应用于互联网
·为照片分享应用创建一个schema,让它成为前后端团队间的桥梁和契约
·使用JavaScript构建功能完备的GraphQL服务,使用Apollo实现客户端
·了解如何为生产环境准备GraphQLAPI和客户端
AlexBanks和EvePorcello都是软件工程师,LinkedInLearning作者、讲师以及MoonHighway的创始人。MoonHighway是一家位于北加州的培训和课程开发公司。
前言1
第1章欢迎来到GraphQL的世界5
GraphQL是什么6
GraphQL规范8
GraphQL的设计原则8
GraphQL的起源9
数据传输的历史10
远程过程调用10
简单对象访问协议10
表述性状态传递(REST)10
REST的缺点11
过量获取11
获取不足13
管理REST接口15
现实世界中的GraphQL15
GraphQL客户端库15
第2章图论17
图论相关词汇19
图论的历史22
树就是图25
现实世界中的图形结构28
第3章GraphQL查询语言31
GraphQLAPI工具33
GraphiQL33
GraphQLPlayground35
公共GraphQLAPI37
GraphQL查询字段37
边和连接40
片段41
变更47
使用查询变量48
订阅49
自检50
抽象语法树51
第4章设计schema53
定义类型53
类型54
标量类型55
枚举55
连接和列表56
一对一连接57
一对多连接58
多对多连接59
不同类型的列表61
参数63
筛选数据64
变更67
输入类型68
返回类型71
订阅类型72
schema文档73
第5章创建一个GraphQLAPI77
项目设置77
解析器78
根解析器80
类型解析器81
使用输入和枚举类型84
边和连接86
自定义标量90
apollo-server-express94
上下文97
安装MongoDB97
将数据库添加到上下文98
GitHub授权100
设置GitHub授权100
授权流程101
githubAuth变更操作103
验证用户106
总结112
第6章GraphQL客户端113
使用GraphQLAPI113
fetch请求113
graphql-request115
ApolloClient117
在React中应用ApolloClient118
启动项目118
配置ApolloClient119
Query组件121
Mutation组件124
授权126
为用户授权127
用户识别130
添加缓存132
取回策略132
持久缓存133
更新缓存134
第7章现实世界中的GraphQL139
订阅139
使用订阅140
在项目中配置订阅144
上传文件148
在服务器端处理文件上传149
通过ApolloClient上传一张新照片151
安全157
设置请求超时时间157
数据限制158
限制查询深度158
限制查询复杂度160
ApolloEngine162
让我们更进一步163
增量迁移163
schema优先开发164
GraphQL的业内活动166
社区167
加入社区聊天群组167
译者序
时光如水,开发如梭。技术的发展让曾经高度耦合的前后端实现了分离,RESTfulAPI的诞生让含糊不清的接口有了清晰的表述,H5的发展使移动开发如雨后春笋般发展起来。jQuery替代了繁杂的原生JavaScript操作,而AngularJS、React、Vue又开启了一个新的时代,前端路由API也带来了单页面应用(SPA)的全面普及。再接下来,NodeJS又让前端终于有能力把眼光从那单薄的浏览器转向更深的后端和网络,Express和Koa等服务端框架也就应运而生。
思想如花,谢去了往日的美艳,才会迎来明日的绚烂。
前端方面,组件化开发慢慢成为潮流,组件的状态也由其自身来管理。组件化带来了便利,也带来了些许烦恼。通常来说,在嵌套的组件树中,有的组件需要把异步请求(Ajax)的数据和状态发送给子组件或是通知给父组件,这就不可避免地产生了结构复杂度、数据来源的不清晰,代码的可读性变差进而导致维护起来不方便,项目迭代也就成了另一个令人挠头的问题。
后端方面,虽然从简单对象访问协议(SOAP)过渡到了表述性状态传递(REST),但是API的接口数量变多且维护的成本也变高了。一般来说接口的数量通常由业务场景来决定,为了尽量减少接口数量以优化请求,后端工程师们需要构建低粒度的数据接口,再根据业务场景进行组合,对外暴露业务接口。此外,接口的扩展成本也提升了。移动端不需要太多的字段,PC端则需要展示更多的数据,需求可谓南辕北辙。再者,单页面出于SEO的原因也需要对首屏进行性能优化,不仅需要进行服务端渲染(SSR),还要对接口进行合并。
在以上前提下,Facebook于2015年开源了GraphQL,期望能够成为取代REST的新一代的查询语言。同REST相比,GraphQL有以下几个优点:
提高开发速度。GraphQL可以减少发出的请求数,以单个调用来获取所需数据比使用多个请求要容易得多,不仅减少了延迟,还能够降低服务器的压力,加快前端的渲染速度。此外,GraphQL具有自文档的特点,所以可以省去查找文档了解如何使用API的时间。
提升开发者体验。GraphQL让端开发者花更少的时间思考如何获取数据。在使用Apollo时,只需要在UI中声明数据。数据和UI放在一起,阅读代码和编写代码都变得更方便了。GraphQL之于数据,就如React之于UI。
将复杂的API进行简化和标准化。GraphQL使工程师可以按照需求自由组合和嵌套对象。对于每个对象都能够获得所需的数据,不多也不少。
提升安全性。GraphQL需要进行schema验证,而且是强类型的,因为这是它规范的一部分。同时静态验证也提升了工程师在重构时的信心。此外,GraphQL为客户端提供了控制,它可以频繁更新,而不会因为引入了新类型造成重大变更。另外,因为引入了schema,所以GraphQL是一种无版本的API。
GraphQL是一种协议和一种查询语言。GraphQLAPI可以直接访问数据存储,但在大多数情况下,GraphQLAPI是一个数据聚合器和一个抽象层,一个可以提升开发速度、减少维护工作并让开发人员更快乐的层。
《GraphQL学习指南》从GraphQL的历史和规范讲起,结合React和Apollo帮助读者从实际项目中了解GraphQL在服务端和客户端两方面的构建方式。《GraphQL学习指南》也算是为GraphQL的布道尽一份力,推广一下下一代API的构建形式。
智慧如叶,飘落了今昔的优雅,迎来明日的翩跹。
技术随着时代发展而进步和变革的脚步从未停止。今天奉为圭臬的准则说不定就是明天的谬论。不断吐故纳新,才能让自己站在技术的前沿,跟上时代的潮流。我们站在前人的肩膀上,但又不能止于巨人的肩膀。不断追求看得更远才能继续攀登,智慧才能一代一代发展流传,生生不息。
感谢新浪移动大前端给我这次机会能够让我从事《GraphQL学习指南》的翻译工作,能够为GraphQL的发展搭一阶台阶,倍感荣幸。也希望《GraphQL学习指南》能帮到各位同行,让大家一起进步。
新浪移动大前端 郭笑鹏(大笑)
2019年5月于北京
前言
致谢
如果没有许多杰出人物的帮助,就没有这《GraphQL学习指南》的诞生。最早是我们的《LearningReact》一书的编辑AllyMacDonald鼓励我们写作《GraphQL学习指南》的。之后我们非常幸运地与AliciaYoung合作,正是她主导了这《GraphQL学习指南》的出版。感谢JustinBilling、MelanieYarbrough和ChrisEdwards,他们的辛勤审校排除书中的错误。
在整个过程中,我们很幸运地从Apollo团队的PeggyRayzis和SashkoStubailo那里得到了反馈,他们分享了关于最新特性的见解和建议。还要感谢AdamRackis、GarrettMcCullough和ShiviSingh,他们都是优秀的技术编辑。
写这本关于GraphQL的书是因为我们热爱GraphQL。我们认为你也会热爱它的。
《GraphQL学习指南》排版约定
《GraphQL学习指南》使用以下排版约定:
斜体(Italic)
指示新术语、URL、电子邮件地址、文件名和文件扩展名。
等宽字体(Constantwidth)
表示代码段以及段落中的程序元素,比如变量、函数名、数据库、数据类型、环境变量、语句以及关键字。
等宽粗体(Constantwidthbold)
显示应由用户按字面输入的命令或其他文本。
等宽斜体(Constantwidthitalic)
表示将由用户提供的值(或由上下文确定的值)替换的文本。
这个图标表示提示或建议。
这个图标表示重要说明。
这个图标表示警告或提醒。
使用代码示例
《GraphQL学习指南》的随附资料(代码示例、练习题等)可以从网址https://github.com/moonhighway/learning-graphql/下载。
让《GraphQL学习指南》助你一臂之力。也许你需要在自己的程序或文档中用到《GraphQL学习指南》中的代码。除非大段使用,否则不必与我们联系取得授权。例如,无须请求许可,就可以用《GraphQL学习指南》中的几段代码写成一个程序。但是销售或发布O扲eilly图书中的代码则必须事先获得授权。引用书中的代码来回答问题也无须获得授权。将大段的示例代码整合到你自己的产品文档中则必须经过许可。
使用我们的代码时,希望你能标明它的出处,但不强求。出处信息一般包括书名、作者、出版商和书号。例如:LearningGraphQL(O扲eilly,2018),EvePorcello和AlexBanks著。书号为978-1-492-03071-3。
如果还有关于使用代码的未尽事宜,可以随时与我们联系:permissions@oreilly.com。
Safari在线电子书
Safari(前身为SafariBooksOnline)是一个面向企业、政府、教育工作者和个人的会员制培训和参考平台。
会员可以访问来自超过250家出版商的书籍、培训视频、学习路径、互动教程和精心策划的播放列表,包括O扲eillyMedia、HarvardBusinessReview、PrenticeHallProfessional、Addison-WesleyProfessional、MicrosoftPress、Sams、Que、PeachpitPress、Adobe、FocalPress、CiscoPress、JohnWiley&Sons、Syngress、MorganKaufmann、IBMRedbooks、Packt、AdobePress、FTPress、Apress、Manning、NewRiders、McGraw-Hill、Jones&Bartlett和CourseTechnology等。
更多信息,请访问http://oreilly.com/safari。
如何联系我们
对于《GraphQL学习指南》如果有任何意见或疑问,请按照以下地址联系《GraphQL学习指南》出版商。
美国:
O'ReillyMedia,Inc.
1005GravensteinHighwayNorth
Sebastopol,CA95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
在《GraphQL学习指南》的专属网页,你可以找到《GraphQL学习指南》的相关信息,包括勘误表、示例代码以及其他信息。网页地址为:
http://bit.ly/learning-graphql-orm
对《GraphQL学习指南》的评论和技术性问题,请发送电子邮件到:
bookquestions@oreilly.com
要了解更多O'Reilly图书、培训课程、会议和新闻的信息,请访问:
http://www.oreilly.com
我们在Facebook的地址为:http://facebook.com/oreilly。
请关注我们的Twitter动态:http://twitter.com/oreillymedia。
我们的YouTube视频地址:http://www.youtube.com/oreillymedia。









