用了6个月的GraphQL,分享一些真实感受
极客时间编辑部
讲述:丁婵大小:7.67M时长:05:35
你好,欢迎收听极客视点。
GraphQL 是一种用于 API 的查询语言,同时基于你的现有数据来执行这些查询的服务端运行时。它为 API 中的数据提供了一套易于理解的完整描述,并让客户端能准确地获得它们所需的查询内容,且不会附带任何冗余信息。
最近,软件工程师曼尼斯·贾恩(Manish Jain)发文描述了他使用 GraphQL 6 个月的感受,供你参考。
优点
1. 实用的数据交换
使用 GraphQL 时,开发者可以根据客户端需要的字段对查询进行灵活定义,这样“量体裁衣式”的自定义非常实用,而且执行起来十分简单。如果前端需要一个人的“名字”和“年龄”,GraphQL 就能只对这两个字段进行查询。而这个人的“姓”和“地址”就不会在该查询的响应中被发送。
2. 使用数据加载器来减少网络调用
尽管 GraphQL 库本身并不包含数据加载器(Dataloader),但是数据加载器的确是一个非常实用的程序库,可以用来解耦你的 APP 中互不相关的部分,还不会牺牲批处理数据加载的性能。虽然数据加载器提供了一个加载单个值的 API,但所有并发请求将被组合起来并提交给你的批处理加载函数。这就能让你的 APP 在整个应用程序中安全地执行分布式数据获取。
3. 在公开数据和数据库模型之间进行解耦
GraphQL 的一大优点是能以解耦的方式将数据库建模数据对用户进行选择性的公开。这样,在对持久层(persistence layer)进行设计时,我们可以在聚焦于该层需求的同时,兼顾考虑怎样才是向外部世界公开数据的最佳方式。该功能还能与数据加载器联合起来使用,因为你可以在将数据发送给用户前将这些数据组合在一起,这样的话,为公开数据设计模型就会变得非常容易。
4. 摆脱 API 版本控制的烦恼
API 版本控制是一个经常遇到的问题。一般而言,通过在相同的 API 前面添加一个 v2 标签来添加一个新版本来解决这个问题是相当简单的解决方案。但使用 GraphQL 时情况就大不相同了,尽管你还是可以使用上述解决方案来处理这个问题,但这并不符合 GraphQL 的自由精神。GraphQL 的文档明确指出,你应该升级你的 API,这意味着在不破坏原 API 的情况下向现有端点添加更多字段。前端仍然可以使用相同的 API 进行查询,并且在需要的时候请求新字段。
这个特性在与前端开发团队协作时非常有用。由于设计更改,前端团队可以请求添加所需要的新字段,而后端团队可以轻松地实现该字段的添加,且不会扰乱现有的 API。
5. 前后端团队独立开发
使用 GraphQL,前端和后端团队可以彼此独立地工作。由于 GraphQL 包含严格类型定义的 schema,前后端团队可以互不干扰地并行工作。首先,前端团队甚至在无需查看代码的情况下,就可以很容易地从后端生成 schema。而这个生成的 schema 可以直接用于查询的创建。其次,前端团队还可以一直使用 API 的 mock 版本进行开发工作。他们还可以用 mock 版本来测试代码。这为开发人员提供了相当令人愉悦的体验,且完全不会对他们的开发工作造成任何妨碍。
缺点
1. 并不是所有的 API 都可以升级
有时,由于来自业务或设计的变化日积月累,迫使 API 的实现需要完全更改。在这种情况下,你将不得不依赖旧的方法来进行 API 版本控制。
2. 难维护的代码
在使用数据加载器来获取数据时,代码有时会分散到多个地方,这对代码的维护造成了一些困难。
3. 响应时间长
由于查询可以不断升级并变得非常庞大,这有时会影响查询的响应时间。要避免这种情况,请确保让响应资源保持简洁。
4. 缓存困难
通常对一个 API 响应进行缓存的主要目的是能更快地从未来的请求中获得响应。与 GraphQL 不同,REST 的 API 所利用的是将缓存内置于 HTTP 技术规范中。正如前面提到的,一个 GraphQL 查询可以请求资源的任何字段,这就使得在 GraphQL 里使用缓存天生就很困难。
结论
GraphQL 所提供的极大灵活性让它的缺点瑕不掩瑜。当然这里提到的优点和缺点可能并不总是适用于所有应用场景,但是值得在决定是否使用 GraphQL 时纳入考虑,
以上就是今天的内容,希望对你有所帮助。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
该免费文章来自《极客视点》,如需阅读全部文章,
请先领取课程
请先领取课程
免费领取
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论