当前位置: 首页 > 后端技术 > Node.js

为什么GraphQL和Apollo可以帮助你更快的完成开发需求?

时间:2023-04-03 21:01:04 Node.js

在大型前端应用的开发过程中,如何管理好数据是一件非常具有挑战性的事情。后端工程师需要聚合多个数据源的数据,然后分发到大前端的各个端,而大前端工程师需要考虑如何在实现一个端点的基础上对端的数据进行管理。良好的用户体验视图(乐观的UI1)。状态。在团队中使用GraphQL可以很好的解决数据管理的痛点。接下来,本文将介绍GraphQL声明式获取数据的方式,这将简化数据管理的难度,提升网络性能。它还将介绍Apollo2如何通过一系列提供良好开发者体验的工具来提高工程师的开发效率。译注一:OptimisticUI是一种UI设计模式。比如你在微信上发一条消息,它会直接显示出来,而不是等待消息的网络请求成功或失败。optimisticUI的数据管理非常复杂。它需要先显示模拟数据,然后等待网络请求成功或失败,再显示真实数据。通过Apollo可以轻松实现OptimisticUI。译注2:Apollo是实现,GraphQL是标准,和JS/ECMA的关系是一样的。开发人员体验Apollo可帮助团队更快地将功能推向市场,因为它具有出色的开发人员体验。Apollo的目标是“简化堆栈中的数据管理”。通过ApolloClient、ApolloServer、ApolloEngine,以前需要费一番功夫才能实现的全栈缓存、数据归一化、乐观UI等功能现在变得非常简单。请求你想要的数据GraphQL的强类型查询语言特性允许开发者使用强大的工具来请求GraphQL接口。通过GraphQL自省系统,开发者可以查询GraphQLschema3信息,包括字段和类型。内省系统有一些非常酷的功能,比如自动生成的文档、代码完成等等。注解3:schema用来描述你想要的数据的结构和字段,比如:{dogs{idbreedimage{url}activities{name}}}GraphQLPlaygroundPrisma团队开发的GraphQLPlayground工具是一款优秀的可以从自定义模式和查询历史自动生成文档的IDE。只需查看它,您就知道GraphQLAPI中有哪些数据可用,而无需深入研究后端代码或了解数据的来源。ApolloServer2.0内置了GraphQLPlayground,可以让您更轻松地浏览schema和执行查询命令。ApolloDevToolsApolloDevTools是一个Chrome扩展,可以查询Apollo的前端缓存(Cache)、记录查询(Queries)和变更(Mutations)。您还可以使用ApolloDevTools中的GraphiQL轻松测试前端查询。简化前端代码如果你使用过REST和Redux等状态管理库,为了发起网络请求,你需要编写actioncreators、reducers、mapStateToProps并集成中间件。有了ApolloClient,你就不用再关心这些了。ApolloClient解决一切,你只需要专注于查询,而不用写一堆状态管理代码。从“apollo-boost”导入ApolloClient;constclient=newApolloClient({uri:"https://dog-graphql-api.glitch.me/graphql"});一些团队声称,他们在切换到ApolloClient后,删除了数千行状态管理代码和一堆复杂的逻辑。这是因为ApolloClient不仅支持远程数据管理,还支持本地数据管理。Apollo缓存是当前应用程序全局状态的唯一真实来源。现代工具Apolloplatform4允许团队使用现代工具来帮助他们快速查找错误、查看API和开发具有挑战性的缓存功能。译注4:Apollo平台是一个云平台。阿波罗在本文中有两层含义。首先,Apollo是GraphQL的开源实现。其次,Apollo是一家开发Apollo平台、ApolloClient、ApolloServer等产品的公司。ApolloEngine是GraphQL生态系统中唯一为API提供监控和分析的工具。引擎可以显示每个解析器的埋索引5,帮助您定位错误,并分析架构中请求的每个字段的分布频率。您也可以将这些数据传输到您正在使用的其他分析平台,例如DataDog,并在某些数据超过警报阈值设置时发出警报。注释5:解析器处理返回字段的功能。使用GraphQL获取声明式数据的主要优点之一是它具有获取声明式数据的能力。不需要前端请求多个接口,不需要手动聚合数据。你只需要准确地描述它。你想要的数据,然后GraphQL就会把你想要的数据返回给你。使用REST,需要调用各个接口,过滤出自己想要的数据,然后将过滤后的数据构造成组件需要的结构。GET/api/dogs/breedsGET/api/dogs/imagesGET/api/dogs/activitiesREST的方法不仅不好用,而且容易出错,逻辑难以跨平台复用。将其与GraphQL的声明式方法进行对比:constGET_DOGS=gql`query{dogs{idbreedimage{url}activities{name}}}`;上面,我们定义了我们想要从服务器获取的对象的结构。GraphQL负责组合和过滤数据,同时返回我们想要的数据字段和结构。如何使用GraphQL查询?ApolloClient构建了一个用于声明式请求数据的GraphQL方法。在React应用程序中,所有用于获取数据、跟踪加载和错误状态以及更新UI的逻辑都封装在一个Query组件中。这种封装方式使得数据采集组件和展示组件的组合变得容易。下面看看如何在React应用中使用ApolloClient获取GraphQL数据:constFeed=()=>({/*数据获取组件Query*/}{/*显示组件:byFunctionError、Fetching、DogList等组成的组件*/}{({loading,error,data})=>{if(error)returnif(loading||!data)return;return}});ApolloClient管理整个请求周期,从请求开始到请求结束,包括为您跟踪加载和错误状态。无需设置中间件,无需编写模板代码,无需重构数据结构,无需关心请求缓存。您需要做的就是描述您的组件需要的数据,然后让ApooloClient来完成繁重的工作。当你使用ApolloClient的时候,你会发现你可以删除很多不需要的数据管理代码。您可以删除多少行代码取决于您的项目,但一些团队声称他们删除了数千行代码。要详细了解ApolloClient的强大功能,例如乐观的UI、重新获取、分页获取,请查看我们的状态管理指南。提高网络性能在许多情况下,在现有REST接口层之上添加GraphQLAPI层可以提高应用程序的网络性能,尤其是在网络条件不佳的情况下。虽然,您应该使用网络性能监控来衡量GraphQL如何影响您的应用程序,但通常认为GraphQL通过避免客户端-服务器往返和减少请求数据的大小来提高网络性能。更少的请求数据因为从服务器返回的响应只包含你指定的查询数据,GraphQL相比REST可以显着减少请求数据的大小。我们看上篇文章的例子:constGET_DOGS=gql`query{dogs{idbreedimage{url}activities{name}}}`;GraphQL服务响应只包含dogs对象的id、breed、image和activities字段,即使REST层的接口dogs是一个有100个字段的对象,所有多余的字段在返回给客户端之前都会被过滤掉。避免往返由于每个GraphQL请求仅返回一个响应,因此使用GraphQL可以帮助您避免从客户端到服务器的往返。使用REST,请求资源是一个往返行程,而且往返行程加起来很快。如果你请求列表中的每个项目,每个项目都需要一个往返,每个项目中的每个资源也需要一个往返。总次数是两者的乘积,导致请求时间长。注释6:极端REST例子,列表长度N,每一项有3个资源,请求数为3*NGET/api/dogs/breedsGET/api/dogs/imagesGET/api/dogs/activities使用GraphQL,每个查询代表一个往来通讯。如果你希望进一步减少往返,你可以实现查询批处理,将多个查询封装到一个请求中。产品案例研究尽管Facebook在2015年宣布了GraphQL规范,但自2012年以来,GraphQL一直是Facebook移动应用程序开发的重要组成部分。在Apollo团队中,我们发现GraphQL为我们遇到的许多问题提供了出色的解决方案现有的解决方案,我们现在用它来优化我们的技术基础设施。在过去的几年里,我们与开源社区、客户和合作伙伴一起,为开源项目Apollo带来了许多创新。我们很自豪Apollo与各种类型的公司合作,从初创公司到大型企业。除了我们自己的经验之外,我们还收到了在生产中积极使用ApolloGraphQL的企业客户的广泛反馈、贡献和支持。一些最有价值的案例是:纽约时报(https://open.nytimes.com/the-...):了解纽约时报如何从Relay切换到Apollo来为其App实现SSR和持久化查询。Airbnb(https://medium.com/airbnb-eng...:Airbnb在Apollo平台上下了一个大赌注,以加强其微服务的数据层。Express(https://dev-blog.apollodata.c...:使用简单易用的Apollo分页功能来优化我们球队的关键应用。MajorLeagueSoccer(https://dev-blog.apollodata.c...:球队的数据管理工具从Redux切换到Apollo以helpthem去掉了几乎所有的Redux代码https://youtu.be/T2njjXHdKqw):了解KLM团队如何使用GraphQL和Apollo扩展他们的Angular应用程序。