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

目录
相关文章
|
7天前
|
设计模式 前端开发 JavaScript
【JavaScript 技术专栏】JavaScript 设计模式与实战应用
【4月更文挑战第30天】本文探讨JavaScript设计模式在提升开发效率和代码质量中的关键作用。涵盖单例、工厂、观察者、装饰器和策略模式,并通过实例阐述其在全局状态管理、复杂对象创建、实时数据更新、功能扩展和算法切换的应用。理解并运用这些模式能帮助开发者应对复杂项目,提升前端开发能力。
|
11天前
|
JavaScript 前端开发
js变量的作用域、作用域链、数据类型和转换应用案例
【4月更文挑战第27天】JavaScript 中变量有全局和局部作用域,全局变量在所有地方可访问,局部变量只限其定义的代码块。作用域链允许变量在当前块未定义时向上搜索父级作用域。语言支持多种数据类型,如字符串、数字、布尔值,可通过 `typeof` 检查类型。转换数据类型用 `parseInt` 或 `parseFloat`,将字符串转为数值。
17 1
|
1天前
|
数据采集 JavaScript 数据可视化
Node.js爬虫在租房信息监测与分析中的应用
Node.js爬虫在租房信息监测与分析中的应用
|
7天前
|
开发框架 JavaScript 前端开发
【JavaScript 与 TypeScript 技术专栏】TypeScript 在 Web 开发中的前沿应用
【4月更文挑战第30天】TypeScript在Web开发中日益重要,以其强大的类型系统提升代码质量,支持组件化开发,与React、Vue、Angular等框架良好集成。在大型项目管理中,TypeScript助于代码组织和优化,提高团队协作效率。此外,它提升开发体验,提供智能提示和错误检测。众多成功案例证明其前沿应用,未来将在Web开发领域持续发挥关键作用。
|
7天前
|
前端开发 JavaScript 网络协议
【JavaScript技术专栏】WebSockets在JavaScript中的应用
【4月更文挑战第30天】WebSocket是为解决HTTP协议在实时通信上的局限而诞生的技术,提供全双工、持久连接的通信方式,适合在线聊天、实时游戏等场景。JavaScript中的WebSocket API使浏览器与服务器能建立持久连接,通过事件处理连接、发送/接收数据及错误。相较于AJAX轮询和长轮询,WebSockets更高效、实时,是现代Web实时通信的优选。
|
7天前
|
移动开发 JavaScript 前端开发
【JavaScript技术专栏】Web Worker在JavaScript中的应用
【4月更文挑战第30天】HTML5的Web Worker API解决了JavaScript单线程性能瓶颈问题,允许在后台线程运行JS代码。本文介绍了Web Worker的基本概念、类型、用法和应用场景,如复杂计算、图像处理和数据同步。通过实例展示了搜索建议、游戏开发和实时数据分析等应用,并提醒注意其无法直接访问DOM、需消息传递通信以及移动端资源管理。Web Worker为前端开发提供了多线程能力,提升了Web应用性能和用户体验。
|
8天前
|
JSON 前端开发 JavaScript
使用JavaScript制作一个简单的天气应用
使用JavaScript制作一个简单的天气应用
|
9天前
|
SQL 存储 前端开发
React&Nest.js全栈社区平台(五)——👋封装通用分页Service实现文章流与详情
React&Nest.js全栈社区平台(五)——👋封装通用分页Service实现文章流与详情
React&Nest.js全栈社区平台(五)——👋封装通用分页Service实现文章流与详情
|
9天前
|
存储 SQL 前端开发
React&Nest.js社区平台(四)——✏️文章发布与管理实战
React&Nest.js社区平台(四)——✏️文章发布与管理实战
|
9天前
|
存储 前端开发 API
React&Nest.js全栈社区平台(三)——🐘对象存储是什么?为什么要用它?
React&Nest.js全栈社区平台(三)——🐘对象存储是什么?为什么要用它?