如何在 Headless CMS 中使用 GraphQL,从此告别 RESTful API

在现代 Web 应用开发中,使用 RESTful API 是非常常见的一种方式,但随着技术的不断发展,GraphQL 已经成为一个很受欢迎的替代方案。尤其在 Headless CMS 中使用 GraphQL,更能够提供更好的用户体验、更高效的数据处理和更灵活的数据查询。

什么是 Headless CMS?

Headless CMS 是一种在 Web 应用程序架构上,前端和后端分离的内容管理系统。与传统 CMS 不同的是,Headless CMS 只关注到了内容管理方面,它只提供了处理和存储内容的功能,却不对内容的渲染过程负责。这使开发人员得以更加自由地在任意环境中自主使用数据。

Headless CMS 通常提供两种 API 接口:RESTful API 基于传统的 HTTP协议,使用方便,但交互广泛;而 GraphQL 更加灵活,轻便,但不太容易使用。

什么是 GraphQL?

GraphQL 是一种用于 Web 应用程序的查询语言,最初由 Facebook 进行开发和维护,用于 React 中构建客户端应用。 GraphQL 的出现是为了解决 RESTful API 的一些缺陷,实现更好的数据平衡问题 。

具体来说,GraphQL 可以根据客户端的请求,精确地返回请求的数据,比传统的 RESTful API 更灵活、更快速,同时它也可以输出有关服务功能的完整信息。 这使得使用 GraphQL 更容易开发跨平台 web 应用程序。

为什么要使用 GraphQL?

传统的 RESTful API 的最大问题之一是“over-fetching”和“under-fetching”。

从应用的角度来看,“over-fetching”是指当我们尝试从服务器中检索数据的时候,我们得到了从我们不需要的表的信息一起返回的所有可能被用到的信息。此时,API的速度和响应时间仅仅受到限制。

另一方面,我们也有“under-fetching”问题,这是因为我们需要检索的数据已破碎在多个表中,我们需要发出多次请求,而这些请求的数据量和时间成本是巨大的。

相比之下,GraphQL 提供了精确的结果查询,从而大量减少数据传输量和数据请求次数 ,有着卓越的性能表现。

除此之外,GraphQL 还具有以下优点:

  1. 更清晰的数据结构:GraphQL API 向客户端提供了一整套数据模型,并且这些模型非常容易被理解。

  2. 更好的开发体验:GraphQL 可以让前端工程师在没有后端接口的情况下,提前定义需要请求的数据结构,然后后端来实现这些接口。

  3. 更少的通信:GraphQL 在上一步完成前,不会发送任何未经请求的数据。因此,它更加易于扩展和更改。

由此可见,使用 GraphQL 比传统的 RESTful API 更加灵活、更加高效,可以大幅改善 Web 应用程序的性能和用户体验。

如何在 Headless CMS 中使用 GraphQL?

根据不同的 Headless CMS 实际情况,这里以 Strapi 为例,介绍在 Headless CMS 中应如何使用 GraphQL。

Strapi 介绍

Strapi 是一种开源的 Headless Content Management System (CMS),它可以很好地为前端应用程序提供 API 接口,而且它相对于其他 Headless CMS 而言是很好上手的。

Strapi 支持 RESTful API 和 GraphQL API,并且为你的应用程序提供了一个大量的默认值提供了 HTTP API 和 WebSocket API。它内置了自定义权限、角色和多种身份验证,可以轻松地扩展和集成到不同的平台上。

配置 Strapi GraphQL API

首先,要安装 GraphQL API 插件以启用 Strapi 在 GraphQL API 中的支持。

- ---- --- ---------------------

安装完之后,在 Strapi 管理面板中找到 「Plugins」项并启用「graphql」插件。

构建 GraphQL 查询

Strapi API 的请求类型的格式为: /{contentType}/{id}。例如,需要请求一篇文章的具体信息,请求的 URL 是 http://localhost:1337/articles/1

在 GraphQL 中,为每个内容类型创建一种查询。下面是一个用于查询文章的示例:

----- -
  -------- -
    ---
    -----
  -
-

这条查询语句将获取所有文章的 ID 和标题。其中, articles 是文档中定义的 model 的单数名称(例如,在 Strapi CMS 中,内容类型 Articles 的单数名称是 Article)。

构建 GraphQL 变异操作

在 Strapi GraphQL API 中,变异操作主要用于实现创建、修改或删除对象等操作。

在 Strapi 中,变异操作与 GraphQL 查询类似,也由 mutations 名称定义,并且具有一个返回类型和一组输入变量。

以下是创建文章条目的示例:

-------- -
  -------------------- -
    ----- -
      ------ ------ --------
      -------- ----- -- - ---- ---------
    -
  -- -
    ------- -
      -----
      -----
    -
  -
-

此语句将创建一篇新文章,标题为“Hello World!” 并返回新文章的标题和slugg。

构建 GraphQL 订阅

在 GraphQL 中, 订阅允许语句检测与已经连接的服务器端数据的更改,从而可以实时更新客户端内容。

以下是 Strapi 中的文章订阅示例:

------------ -
  ------- -
    ------ -
      ------------ --------- --------
    -
  - -
    ---- -
      ----
      -----
    -
  -
-

这条语句用于监视文章资源的变化并触发事件。当创建或更新文章时,将在客户端接收到新文章的 slug 和标题。

总结

使用 GraphQL,从此告别 RESTful API,并从 Strapi GraphQL API 中获得更灵活、高效和更好的用户体验。我们可以对 Strapi 使用 GraphQL 查询、变异操作和订阅操作,并实现定点查询、减少请求数量、简化表单提交流程等。

正如我们所看到的,尽管 Strapi API 看似浓郁而简单,GraphQL 要求我们定义类型-数据结构之间的严格规则,以允许前端应用程序特定地提出请求,并执行特定的操作。在 Headless CMS 中使用 GraphQL 之前,我们应该花时间了解了 GraphQL 的查询结构,并依据实际业务需要构建合适的查询。

这样,我们的前端应用程序将能够更加灵活而有效的执行请求,从而提高组成 Headless CMS 的所有服务的总体性能。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/64abc82348841e989479cc40


猜你喜欢

  • CSS Flexbox 与浏览器兼容性的研究及经验总结

    CSS Flexbox 是一种用于布局的新型 CSS 技术,可以帮助前端开发者更轻松地实现复杂的页面布局。然而,由于不同版本的浏览器对 CSS Flexbox 的支持程度不同,开发者需要对浏览器兼容性...

    1 年前
  • RESTful API 中的跨域请求处理方法

    在开发 Web 应用时,跨域请求是一个常见的问题。在 RESTful API 开发中,处理跨域请求就显得格外重要。本文将介绍什么是跨域请求,以及如何有效地处理跨域请求。

    1 年前
  • 在 Vue SPA 应用中如何实现表单数据的校验?

    在前后端分离的应用架构中,表单验证是必不可少的一步。在 Vue 的单页面应用中,使用插件或者自己手写验证逻辑都是可行的方式。本文将详细介绍如何使用 Vuelidate 插件进行表单数据的校验。

    1 年前
  • Webpack 自动化构建流程实现

    前言 随着 Web 应用功能的不断增强和复杂,前端代码的体积日益庞大,模块化的开发方式也越来越成为主流。其中,Webpack 是一款优秀的模块化打包工具,拥有强大的自动化构建能力,可以帮助我们优化前端...

    1 年前
  • 使用 Node.js 获取 POST 数据时出现 undefined 的解决方法

    在开发中,我们经常会遇到需要通过 POST 请求获取前端传来的数据进行处理的情况。但是,有时我们会发现使用 Node.js 获取 POST 数据时出现了 undefined 的问题,这时候就需要及时解...

    1 年前
  • 前端工程师必会的无障碍技术入门

    作为前端工程师,我们需要保证我们的网站能够被尽可能多的人所访问和使用,包括那些使用辅助功能的人。按照 WCAG2.1 规范,我们需要为这些人提供无障碍体验,这也是我们应该尽力遵守的道德和法律义务。

    1 年前
  • Docker 容器使用时的端口映射方法

    Docker 是目前流行的容器化技术,可以将应用程序以容器的形式运行在不同的环境中。容器化技术的优势在于快速部署、可移植性强、资源占用少等等。在使用 Docker 运行应用程序时,端口映射是非常重要的...

    1 年前
  • 一篇文章全面解读 DevOps 在 Serverless 中的应用

    随着 Serverless 技术的不断发展, DevOps 也逐渐成为了 Serverless 应用开发和部署中不可或缺的一环。本文将详细讲解 DevOps 在 Serverless 中的应用,探讨如...

    1 年前
  • ECMAScript 2017 中如何使用 const/let/for 循环进行数组去重

    ECMAScript 2017 中如何使用 const/let/for 循环进行数组去重 在前端开发中,我们经常需要对数组进行去重操作。在 ECMAScript 2015(ES6)之前,我们通常使用 ...

    1 年前
  • ECMAScript 2016(ES7)中如何使用 ArrayBuffer.transfer()

    在 ES6 中我们学习了许多新的语言特性和 API,其中有一些很常用的用于处理数据的 API,比如 TypedArray 和 ArrayBuffer。而在 ECMAScript 2016(ES7)中,...

    1 年前
  • Express.js 中如何处理文件上传的功能?

    在 Web 应用中,文件上传是一项基本操作。Express.js 是一款流行的 Node.js Web 框架,提供了丰富的功能和插件支持。它也可以很容易地实现文件上传的功能。

    1 年前
  • Kubernetes 使用 Flexible Pod Anti-Affinity 进行负载均衡

    什么是 Kubernetes? Kubernetes 是 Google 开源的容器编排平台,用于自动化部署、扩展和管理容器化的应用程序。在 Kubernetes 中,应用程序被部署在容器中,并运行在共...

    1 年前
  • RxJS 的 Map 和 flatMap 操作符详解

    RxJS 的 Map 和 flatMap 操作符详解 RxJS 是一个非常常用的 JavaScript 函数库,它提供了一些用于处理异步数据流的操作符,其中 Map 和 flatMap 是两个非常重要...

    1 年前
  • 使用 Jest 对 Vue 组件进行单元测试指南

    Vue.js 是一款流行的前端框架,它的组件化的开发模式可以大大提高开发效率和代码的可复用性。但是,在组件化的开发中,我们如何对组件进行单元测试,以保证我们的组件代码质量,确保组件在不同场景下的正确性...

    1 年前
  • PM2 监控的日志输出模式解析及使用指南

    在前端开发中,我们经常需要针对应用程序进行监控和管理。PM2 是一款多进程管理工具,它可以管理 Node.js 应用程序的启动、重启、停止、监控和日志等操作。在使用 PM2 进行应用程序监控的过程中,...

    1 年前
  • 如何使用 Server-Side Rendering (SSR) 提高 Next.js 应用程序的性能

    前言 在前端开发中,我们通常使用客户端渲染来实现页面展示。但客户端渲染有一些缺点,比如页面速度慢、SEO 友好性不够、首次渲染时间长等。为了解决这些问题,我们可以使用服务端渲染(Server-Side...

    1 年前
  • Custom Elements 如何支持双向数据绑定

    在现代的前端开发中,数据绑定是一项非常重要的特性。数据绑定允许开发人员使用 JavaScript 操作 DOM 元素,并且使得数据更容易在视图中实现同步更新。Custom Elements 是一项非常...

    1 年前
  • 如何处理 Hapi.js 中的 “ERR_TLS_CERT_ALTNAME_INVALID” 错误?

    在使用 Hapi.js 构建 Web 应用时,有时候会出现一种错误:“ERR_TLS_CERT_ALTNAME_INVALID”。它通常表示 SSL/TLS 证书中的域名不匹配。

    1 年前
  • Web 开发实战|ES6、ES7、ES8、ES9、ES10、ES11 全梳理

    ES(EcmaScript)是 JavaScript 的标准。自 ES6 开始,JavaScript 发生了历史性的变化,包括新增语法、变量声明、解构、箭头函数、类、模块化等功能,使得 JavaScr...

    1 年前
  • 如何使用 Promise 实现多个请求数据同步更新

    前言 在前端开发中,数据加载是一个非常关键的问题。很多时候,我们需要同时发起多个数据请求,但是这些请求的返回时间不一定相同,这就导致了我们很难在数据全部返回后再去更新页面数据。

    1 年前

相关推荐

    暂无文章