随着 Web 技术的不断发展,网站的开发过程也变得更加复杂。尤其是在内容管理方面,传统的 CMS(Content Management System,内容管理系统)基本上都具备了前端渲染、数据管理、权限控制等功能但是限制了前端页面的设计思路。为了解决这个问题,Headless CMS(无头 CMS)应运而生,它把内容管理和前端分离,为前端开发带来极大的灵活性和自由性,并且在网站性能优化方面也发挥了重要作用。
Headless CMS 简介
Headless CMS 是一个基于 API 的 CMS,它对于前端开发者来说,提供了纯净的数据接口。Headless CMS 的工作原理如下:
- 后端管理系统维护数据模型和数据。
- 前端通过 API 请求获取数据。
- 前端使用数据自行编写页面。
Headless CMS 确保数据可见,并允许复用。换言之,数据模型和数据允许多端访问使用,如移动应用程序、网站、物联网设备等。
静态网站生成器
Headless CMS 和静态网站生成器结合使用的很好,而且这种方案还适用于 JAMstack(JavaScript、API、Markup)。
静态网站生成器是一种将内容和网站生成一起存储在 HTML/CSS/JS 文件中的工具。它们旨在提供快速、高性能的用户体验,是基于预渲染的,因此可以在 CDN 上缓存这些文件。有了 Headless CMS,我们可以使用其 API 获取所有数据并在本地预渲染整个网站,然后发布相应的静态文件。
以下是一个基于 Gatsby.js 的静态网站生成器项目结构示例:
-- -------------------- ---- ------- ---- ------ -------- -------- ---------- ---------- ----------- ------ ----------- --------- --------- ------------------ ---------- ----------- ------ ---------- ---------------- --------------
在上面的项目结构中,src/pages
目录是我们要渲染的页面,src/components
目录包含所有的 React 组件,src/templates
目录是以 Markdown(或任何其他 CMS 中支持的格式)编写的文章和类别的样板。
通过配置 gatsby-config.js
文件,我们可以使用 Headless CMS 的 API 查询数据,然后将查询结果传递给 React 组件。
数据缓存
我们希望尽可能减少 API 请求,这也可以通过缓存来实现。在前端应用程序中,我们可以使用 localStorage 或 sessionStorage 将数据缓存在用户的本地浏览器中。Headless CMS API 提供更新的时间戳,我们可以使用这些更新来检查何时需要更新本地缓存的数据。
以下是一个示例代码:
-- -------------------- ---- ------- ----- ---- - ----------------------------------------- ----- --------- - ----- -- -- - ----- -------- - ----- ------------------------------------------- ----- ---- - ----- ---------------- ---------------------------- ---------------------- -- -- ------ -- ---------- - ---------------- - -------- - ------------ -
在此示例中,我们首先尝试从本地存储中获取数据。如果数据不存在或已过期(超过一小时),则会发起新的 API 请求并将查询结果存储到本地存储中。
图片优化
在 Web 应用程序中,图像是页面加载速度的一个重要因素。然而,为了提高速度,我们经常需要通过使用合适的格式、大小和压缩方法来对图像进行优化。Headless CMS 允许我们使用自动化方案对图像进行优化。
我们可以使用 gatsby-image插件来处理带有缩略图的可响应图像,该插件通过查询图片的数据才处理并使用合适的格式。如果您的 Headless CMS 支持图片大小的选择,则可以传递此参数以进一步优化选中的图像。
<Image sizes={article.featuredImage.sizes} alt={article.featuredImage.alt} />
在此示例中,我们使用文章的特色图片,它的大小会在 Headless CMS 的后端根据需要自动生成。我们可以将这些大小参数传递给 Image
组件,以获得最佳性能的图像。
服务器端渲染
虽然静态网站生成器的性能很好,但它可能无法满足某些网站的需求。在这种情况下,我们可以使用服务器端渲染(SSR)。
SSR 通过将代码渲染到服务器上,然后将已渲染的 HTML 页面发送到客户端以进行呈现。这种方法可提高页面加载速度并优化 SEO。
Headless CMS 通过 API 提供数据,并支持多种语言和技术栈,因此可以与各种 SSR 解决方案一起使用。例如,我们可以使用 Next.js 来构建一个完美的 SSR 网站。
以下是一个示例代码:
-- -------------------- ---- ------- -- ------------------------- ------ - --------- - ---- -------------- ------ - -------- - ---- ---------------------- ------ - --- - ---- --------------- ----- ------------- - ---- ----- ------- -------- - ------------- ------ - ----- ----------- ---- - - -- ----- ------- - -- -- - ----- ------ - ------------ ----- ---- - ------------------ ----- - ----- -------- ----- - - ----------------------- - ---------- - ---- -- --- -- --------- ------ ------------- -- ------- ------ ------- ------------------ ----- - ------ ------------ ---- - - ------------- ------ - --------- ---------------- -------------------------- ---- -------------------------- ------- ---- -- -- ---------- -- -- ------ ------- --------
在此示例中,我们使用 useRouter
和 useQuery
钩子获取文章的 slug,并使用 GraphQL 查询来获取文章的完整数据。我们还使用 dangerouslySetInnerHTML
属性呈现文章的 HTML 内容,但是如果你使用的是 React 模板,你可以使用像 Next.js 提供的 Server Side Rendering(SSR)解决方案进行 Server-Side rendering.
总结
Headless CMS 的出现使得前端技术领域变得更加灵活和自由,使内容管理变得更加容易。与其它 CMS 相比,Headless CMS 在网站性能优化方面具有很大优势,并且可以更加巧妙地实现缓存和图像优化等功能。无论是使用静态网站生成器还是服务器端渲染,Headless CMS 都可以胜任。希望这篇文章对您在实践中的应用和学习有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64a1d07748841e9894e04bab