Next.js让你的React应用SEO更友好

简介: 本文旨在展示同构应用的概念以及 Next.js 是如何解决的。我们提供了一些详细的代码片段。

原文作者:Arnaud Lewis
译者:UC 国际研发 桥川

----
image.png

为了可以在 Google 上获得一个好的排名并为你的网站提升曝光量,SEO 已经成为非常最重要的环节。如果你曾想过如何继续使用 React 开发 Web 应用,同时又没有糟糕的 SEO 和首屏加载延迟的缺点,那你应该了解一下 Next.js。

Next.js 的目标是为开发者提供一个与开发简单 React 应用相近的开发体验,同时又能获得同构应用的所有好处。它降低了学习难度并让 React 社区更容易接受。

本文旨在展示同构应用的概念以及 Next.js 是如何解决的。我们提供了一些详细的代码片段。

配置你的环境

你只需要在系统上安装 Node.js 就可以开始构建 Next.js 应用。当然,你也需要在你的项目中安装以下依赖:

Next:

image.png

Express:

image.png

next-routes:

image.png

这三个库是你开始所需的所有基础了。

Next.js 默认基于页面的路由

Next.js 提供了一个开箱即用的路由系统。它是完全基于页面的,且无需配置的路由系统。

基于页面的路由意味着一个组件基于它在项目中的路径与一个 url 关联。

当开始使用 Next.js 时,你用两个简单的动作即可构建你的第一个页面:

  1. 在你的源目录下创建一个叫做 pages 的目录
  2. 构建你的第一个 React 组件

pages/index.js

image.png

通过访问你网站的主页,你应该可以看到 Hello Next.js 展示在那。

使用基于页面的路由,每个页面都对应一个组件。这是一个常见的系统,你可以在静态网站生成器中找到它。

构建动态路由

Next.js 内置的基于页面的路由是很容易使用的,但大多数时候你需要动态 URL。想象一下,你需要一个在路由级别管理的动态参数,并将其作为属性注入组件中。这就是需要用到动态路由的地方了。

Next.js 有一个内置的服务器实现,需要替换它来实现动态路由。
你很快就会看到,你将设置一个简单的 Express 服务器。Express 是 Node.js 社区的一个知名的框架,因为它的易用性和强大的 url 匹配系统。

配置你的路由
在此示例中,你将会发现 next-rotues ,一个用于处理服务器端和客户端路由的简单工具。

因为我们使用 Express 服务器实现,你的路由将会有与模式匹配完全相同的语法,你可以在 Express 文档找到详细信息。

routes.js

image.png

在上面的示例中,你有 product 和 bl-ogpost 两个动态路由。在这两个路由里,我们都传递了一个 uid 参数到对应的组件。

设置你的服务器
路由准备完毕后,你只需设置服务器并为其提供路由配置即可。

server.js
image.png

更新你的构建环境以包含服务器

当实现了 Express 服务器后,就需要考虑它并更新构建脚本了。

package.json

image.png

在应用中导航

这是 next-routes 非常便利的地方。
通过输出路由,你就有了一个功能完备的路由器,这样你在应用中导航就无需担心你是在服务器端还是客户端。
有两种方式可以在组件之间导航:

1、声明式的使用 Link 组件

pages/blogpost.js:

image.png

在这里你可以观察到两件事。
首先,你有一个来自 props 的名叫 qu-ery 的变量,它包含了动态参数 uid。它来自你的路由系统。
其次,你有一个来自路由配置的 Link 组件。它允许你在组件之间导航,而无需执行整页重新加载。

2、命令式的使用 Router 对象

image.png

在这个例子中,你从路由配置中获取 Router 对象。它允许你以编程的方式管理路由,而不是在模板中执行。

异步的获取外部数据

从外部 API 查询你的内容
设置好应用后,你需要为其提供一些实际的内容,最有可能是来自外部的资源。在同构应用中这样做很痛苦,但 Next.js 提供了一种简单的方法来处理它。

除了众所周知的 React 组件生命周期外,每个页面组件都可以实现一个异步函数 getInitialProps,它将获取的数据以 props 方式提供给组件。

image.png

在上面简单示例中,我们异步的从一个外部源获取数据并将其填充到我们的组件中。

通过预获取内容加快速度
Next.js 还有一个嵌入机制来预获取所有相关页面,以帮助加快你的网站和提供一个真正快速的用户体验。
要预获取链接,你只需向链接添加一个 prefetch 属性即可。

image.png

基本上,对于每个有 prefetch 标记的 Link 组件,Next.js 会在后台通过 Se-rviceWorker 预获取组件的 JSON 表示。如果你四处浏览,则可能在你关注链接或触发路由转换时,该组件已被获取。此外,因为数据是通过专有方法 getInitialProps 获取的,你可以积极的预获取,而不会触发不必要的服务器加载或者数据获取。

近距离观察 Next.js 对同构应用的实现
同构应用是一种以纯 JavaScript 在服务器端 Node.js 上构建的应用。
该架构因 React 变得相当出名,但目前可用于许多客户端框架或库,如 Angular,Vue.js 等。
基本上,它允许你在服务器端和客户端之间共享组件,以便你可以在两端进行渲染。

image.png

组件在首次加载时是如何渲染的

首次加载始终由服务器处理,它会把组件渲染成静态标记,然后将其发送给客户端来渲染 HTML。
完成渲染后,浏览器会加载 JavaScript 然后将所有的浏览器处理器应用到组件上,如 'onClick','onChange'等。
这样做可以避免你等待客户端加载 Jav-aScript 然后再渲染组件。

如何为你的组件在两端都提供数据
大多数情况下,你的组件将依赖外部数据进行渲染。外部数据通常也意味着异步数据。

为客户端生成 HTML
在服务器端,Next.js 访问请求页面所需要的查询,以便它可以计算此查询并在将数据发送给客户端之前将其提供给组件。

在查询完成后,Next.js 将简单地向浏览器发送静态标记,并重新执行 React 以绑定所有浏览器事件。

从客户端恢复数据
为了避免组件进行两次相同的查询,Next.js 将会把数据和 HTML 一起序列化然后提供给组件。 Next.js 暴露了一个静态异步函数 getInitialProps 给每一个页面组件,然后把获取的数据序列化到 script 标签里。在客户端,它会从 window 读取数据然后作为 props 提供给组件。这个机制叫做再水化。

Next.js 的目的是什么?

在 Prismic,我们认为 Next.js 是一个便利的库,适合那些习惯于 React 但在 SEO 和复杂架构方面遇到困难的人。它很容易上手,但也非常强大,因为它提供了一个舒适的定制空间。 使用 Next.js 整合营销内容和SEO页面变得非常高效。

你可以找到一个功能齐全的使用 Prism-ic 和 Next.js 构建的咖啡店例子,以及 Github 上的所有资源。

以上所有例子都受此示例的启发。

英文原文:

https://prismic.io/blog/seo-with-react-and-nextjs

目录
相关文章
|
1月前
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
325 2
|
5天前
|
存储 缓存 JavaScript
如何优化Node.js应用的内存使用以提高性能?
通过以上多种方法的综合运用,可以有效地优化 Node.js 应用的内存使用,提高性能,提升用户体验。同时,不断关注内存管理的最新技术和最佳实践,持续改进应用的性能表现。
|
27天前
|
监控 前端开发 JavaScript
React 静态网站生成工具 Next.js 入门指南
【10月更文挑战第20天】Next.js 是一个基于 React 的服务器端渲染框架,由 Vercel 开发。本文从基础概念出发,逐步探讨 Next.js 的常见问题、易错点及解决方法,并通过具体代码示例进行说明,帮助开发者快速构建高性能的 Web 应用。
67 10
|
26天前
|
资源调度 前端开发 数据可视化
构建高效的数据可视化仪表板:D3.js与React的融合之道
【10月更文挑战第25天】在数据驱动的时代,将复杂的数据集转换为直观、互动式的可视化表示已成为一项至关重要的技能。本文深入探讨了如何结合D3.js的强大可视化功能和React框架的响应式特性来构建高效、动态的数据可视化仪表板。文章首先介绍了D3.js和React的基础知识,然后通过一个实际的项目案例,详细阐述了如何将两者结合使用,并提供了实用的代码示例。无论你是数据科学家、前端开发者还是可视化爱好者,这篇文章都将为你提供宝贵的洞见和实用技能。
52 5
|
25天前
|
数据可视化 JavaScript 前端开发
数据可视化进阶:D3.js在复杂数据可视化中的应用
【10月更文挑战第26天】数据可视化是将数据以图形、图表等形式呈现的过程,帮助我们理解数据和揭示趋势。D3.js(Data-Driven Documents)是一个基于JavaScript的库,使用HTML、SVG和CSS创建动态、交互式的数据可视化。它通过数据驱动文档的方式,将数据与DOM元素关联,提供高度的灵活性和定制性,适用于复杂数据的可视化任务。 示例代码展示了如何使用D3.js创建一个简单的柱状图,展示了其基本用法。D3.js的链式调用和回调函数机制使代码简洁易懂,支持复杂的布局和交互逻辑。
65 3
|
30天前
|
JavaScript 前端开发 开发者
探索JavaScript原型链:深入理解与实战应用
【10月更文挑战第21天】探索JavaScript原型链:深入理解与实战应用
31 1
|
22天前
|
前端开发 JavaScript
JavaScript新纪元:ES6+特性深度解析与实战应用
【10月更文挑战第29天】本文深入解析ES6+的核心特性,包括箭头函数、模板字符串、解构赋值、Promise、模块化和类等,结合实战应用,展示如何利用这些新特性编写更加高效和优雅的代码。
40 0
|
1月前
|
自然语言处理 JavaScript 前端开发
深入理解JavaScript中的闭包:原理、应用与代码演示
【10月更文挑战第12天】深入理解JavaScript中的闭包:原理、应用与代码演示
|
1月前
|
监控 JavaScript 前端开发
深入了解Vue.js:构建现代前端应用的利器
【10月更文挑战第11天】深入了解Vue.js:构建现代前端应用的利器
16 0
|
1月前
|
前端开发 JavaScript 开发者
深入了解Webpack:现代JavaScript应用的打包利器
【10月更文挑战第11天】 深入了解Webpack:现代JavaScript应用的打包利器
下一篇
无影云桌面