前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SEO 在 SPA 站点中的实践

SEO 在 SPA 站点中的实践

作者头像
牧云云
发布于 2021-03-11 03:37:56
发布于 2021-03-11 03:37:56
1.9K00
代码可运行
举报
文章被收录于专栏:云瓣云瓣
运行总次数:0
代码可运行

背景

观察基于 create-react-doc 搭建的文档站点, 发现网页代码光秃秃的一片(见下图)。这显然是单页应用 (SPA) 站点的通病 —— 不利于文档被搜索引擎搜索 (SEO)。

难道 SPA 站点就无法进行 SEO 了么, 那么 Gatsbynuxt 等框架又为何能作为不少博主搭建博客的首选方案呢, 此类框架赋能 SEO 的技术原理是什么呢? 在好奇心的驱动下, 笔者尝试对 creat-react-doc 进行赋能 SEO 之旅。

搜索引擎优化

在实践之前, 先从理论上分析为何单页应用不能被搜索引擎搜索到。核心在于 爬虫蜘蛛在执行爬取的过程中, 不会去执行网页中的 JS 逻辑, 所以隐藏在 JS 中的跳转逻辑也不会被执行

查看当前 SPA 站点打包后的代码, 除了一个根目录 index.html 外, 其它都是注入的 JS 逻辑, 因此浏览器自然不会对其进行 SEO。

此外, 搜索引擎详优化是一门较复杂的学问。如果你对 SEO 优化比较陌生, 建议阅读搜索引擎优化 (SEO) 新手指南 一文, Google 搜索中心给出了全面的 17 个最佳做法, 以及 33 个应避免的做法, 这也是笔者近期在实践的部分。

SEO 在 SPA 站点中的实践案例

在轻文档站点的背景前提下, 我们暂不考虑 SSR 方案。

对市面上文档站点的 SEO 方案调研后, 笔者总结为如下四类:

  • 静态模板渲染方案
  • 404 重定向方案
  • SSG 方案
  • 预渲染方案
静态模板渲染方案

静态模板渲染方案以 hexo 最为典型, 此类框架需要指定特定的模板语言(比如 pug)来开发主题, 从而达到网页内容直出的目的。

404 重定向方案

404 重定向方案的原理主要是利用 GitHub Pages 的 404 机制进行重定向。比较典型的案例有 spa-github-pagessghpa

但是遗憾的是 2019 年 Google 调整了爬虫算法, 因此此类重定向方案在当下是无利于 SEO 的。spa-github-pages 作者也表示如果需要 SEO 的话, 使用 SSG 方案或者付费方案 Netlify

SSG 方案

SSG 方案全称为 static site generator, 中文可译为路由静态化方案。社区上 nuxtGatsby 等框架赋能 SEO 的技术无一例外可以归类此类 SSG 方案。

以 nuxt 框架为例, 在约定式路由的基础上, 其通过执行 nuxt generate 命令将 vue 文件转化为静态网页。

例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-| pages/
---| about.vue/
---| index.vue/

静态化后变成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-| dist/
---| about/
-----| index.html
---| index.html

经过路由静态化后, 此时的文档目录结构可以托管于任何一个静态站点服务商。

预渲染方案

经过上文对 SSG 方案的分析, 此时 SPA 站点的优化关键已经跃然纸上 —— 静态化路由。相较于 nuxt、Gatsby 等框架存在约定式路由的限制, create-react-doc 在目录结构上的组织灵活自由。它的建站理念是文件即站点, 同时它对存量 markdown 文档的迁移也十分便捷。

blog 项目结构为例, 其文档结构如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-| BasicSkill/
---| basic/
-----| DOM.md
-----| HTML5.md

静态化后应该变成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-| BasicSkill/
---| basic/
-----| DOM
-------| index.html
-----| HTML5
-------| index.html

经过调研, 该构思与 prerender-spa-plugin 预渲染方案一拍即合。预渲染方案的原理可以见如下图:

至此技术选型定下为使用预渲染方案实现 SSG。

预渲染方案实践

create-react-doc 在预渲染方案实践的步骤简单概况如下(完整改动可见 mr):

  • 改造 hash 路由为 history 路由。因为 history 路由结构与文档静态化目录结构天然匹配。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default function RouterRoot() {
  return (
-    <HashRouter>
+    <BrowserRouter>
      <RoutersContainer />
-    </HashRouter>
+    </BrowserRouter>
  )
}
  • 在开发环境、生成环境的基础上新增预渲染环境, 同时对路由进行环境匹配。其主要解决了资源文件主域名下的子路径的对应关系。过程比较曲折, 感兴趣的同学可以见 issue
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const ifProd = env === 'prod'
+ const ifPrerender = window.__PRERENDER_INJECTED && window.__PRERENDER_INJECTED.prerender
+ const ifAddPrefix = ifProd && !ifPrerender

<Route
  key={item.path}
  exact
-  path={item.path}
+  path={ifAddPrefix ? `/${repo}${item.path}` : item.path}
  render={() => { ... }}
/>
  • 兼容 prerender-spa-plugin 在 webpack 5 的使用。

官方版本当前未支持 webpack 5, 详见 issue, 同时笔者存在对预渲染后执行回调的需求。因此当前 fork 了一份版本 出来, 解决了以上问题。

经过上述步骤的实践, 终于在 SPA 站点中实现了静态化路由

SEO 优化附加 buff, 站点秒开?

SEO 优化至此, 来看下站点优化前后 FP、FCP、LCP 等指标数据的变化。

blog 站点为例, 优化前后的指标数据如下(数据指标统计来自未使用梯子访问 gh-pages):

优化前: 接入预渲染方案前, 首次绘制(FP、FCP) 的时间节点在 8s 左右, LCP 在 17s 左右。

优化后: 接入预渲染方案后, 首次绘制时间节点在 1s 之内开始, LCP 在 1.5s 之内。

对比优化前后: 首屏绘制速度提升了 8 倍, 最大内容绘制速度提升 11 倍。本想优化 SEO, 结果站点性能优化的方式又 get 了一个。

生成站点地图 Sitemap

在完成预渲染实现站点路由静态化后, 距离 SEO 的目标又近了一步。暂且抛开 SEO 优化细节, 单刀直入 SEO 核心腹地 站点地图

站点地图 Sitemap 格式与各字段含义简单说明如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<urlset>
  <!-- 必填标签, 这是具体某一个链接的定义入口,每一条数据都要用 <url></url> 包含在里面, 这是必须的 -->
  <url>
    <!-- 必填, URL 链接地址,长度不得超过 256 字节 -->
    <loc>http://www.yoursite.com/yoursite.html</loc>
    <!-- 可以不提交该标签, 用来指定该链接的最后更新时间 -->
    <lastmod>2021-03-06</lastmod>
    <!-- 可以不提交该标签, 用这个标签告诉此链接可能会出现的更新频率 -->
    <changefreq>daily</changefreq>
    <!-- 可以不提交该标签, 用来指定此链接相对于其他链接的优先权比值,此值定于 0.0-1.0 之间 -->
    <priority>0.8</priority>
  </url>
</urlset>

上述 sitemap 中, lastmod、changefreq、priority 字段对 SEO 没那么重要, 可以见 how-to-create-a-sitemap

根据上述结构, 笔者开发了 create-react-doc 的站点地图生成包 crd-generator-sitemap, 其逻辑就是将预渲染的路由路径拼接成上述格式。

使用方只需在站点根目录的 config.yml 添加如下参数便可以在自动化发版过程中自动生成 sitemap

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
seo:
  google: true

将生成的站点地图往 Google Search Console 中提交试试吧,

最后验证下 Google 搜索站点优化前后效果。

优化前: 只搜索到一条数据。

优化后: 搜索到站点地图中声明的位置数据。

至此使用 SSG 优化 SPA 站点实现 SEO 的完整流程完整实现了一遍。后续便剩下参照 搜索引擎优化 (SEO) 新手指南 做一些 SEO 细节方面的优化以及支持更多搜索引擎了。

小结

本文从 SPA 站点实现 SEO 作为切入点, 先后介绍了 SEO 的基本原理, SEO 在 SPA 站点中的 4 种实践案例, 并结合 create-react-doc SPA 框架进行完整的 SEO 实践。

如果本文对您有所帮助, 欢迎 star反馈

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-03-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
WordPress 免插件生成最安全的纯静态站点地图(sitemap.xml)
之前酷猫一直使用的是插件生成站点地图的方法,但是用来用去还是各种的不舒服,想了想还是免插件生成最好了,安全还高效!
叮当叮
2020/04/20
1.2K0
WordPress 免插件生成最安全的纯静态站点地图(sitemap.xml)
基于Vue SEO的四种方案
前言:众所周知,Vue SPA单页面应用对SEO不友好,当然也有相应的解决方案,下面列出几种最近研究和使用过的SEO方案,SSR和静态化基于Nuxt.js来说。
yaphetsfang
2020/08/05
6.4K0
基于Vue SEO的四种方案
Astro是2023年最好的web框架,原因如下
以下解释是全面理解为什么 Astro 在2023年成为最佳 web 框架所必需的。
前端小智@大迁世界
2024/02/12
5100
Astro是2023年最好的web框架,原因如下
徐大大seo:XML 站点地图的全面解析
XML 站点地图是一种用于搜索引擎优化的文件,它可以帮助搜索引擎更好地了解网站的结构和内容。本文将对 XML 站点地图进行全面解析,包括定义、结构、作用、生成方法等方面。
徐大大seo
2023/03/13
6810
Nuxt3 实战 (十二):SEO 搜索引擎优化指南
4、/pages/ 目录中可以使用 definePageMeta 来根据当前路由设置元数据
白雾茫茫丶
2024/06/26
6860
Nuxt3 实战 (十二):SEO 搜索引擎优化指南
关于SEO的研究和SPA 项目得SEO优化(科普篇)
SEO的关键指标是什么呢,国内的搜索引擎主要针对百度,那么怎么样的SEO算一个优秀的网站呢?
星宇大前端
2020/10/28
1.4K0
关于SEO的研究和SPA 项目得SEO优化(科普篇)
Hugo 网站优化(9): 实时更新与缓存加速兼顾, 使用 Github Action 主动预热 CDN 缓存
于是, 我又盯上了 Github Action 的实现发布文章后主动预热网站, 这样在 CDN 中的缓存配置就更通用了。
老麦
2023/02/25
3K0
Hugo 网站优化(9): 实时更新与缓存加速兼顾, 使用 Github Action 主动预热 CDN 缓存
Vue SEO的四种方案
众所周知,Vue SPA单页面应用对SEO不友好,当然也有相应的解决方案,通过查找资料,大概有以下4种方法。
青梅煮码
2023/02/18
4K0
SEO杂谈(2)
RP道貌不岸然
2017/11/23
5940
使用预渲染提升SPA应用体验
在目前的前端领域,单页web应用(SPA)已经有了比较高的占有率,比较主流的web框架React、Angular、Vue几乎已经统治了前端市场。
Javanx
2019/09/05
2.9K0
使用预渲染提升SPA应用体验
搜索引擎排名技术,引爆网站流量,你也可以做到 第一课
对于进行关键词排名,没有固定的模式,仅仅是基于传统经验之上慢慢摸索出来的一条道路,通过网站的一些设置让搜索引擎觉得网站更友好,提升搜索引擎蜘蛛停留时间,增加收录。
做全栈攻城狮
2018/12/20
1.2K0
React项目SEO优化实战:掌握这些技巧,提升网站排名!
大家好,我是腾讯云开发者社区的 Front_Yue,随着互联网的发展,React已成为构建现代Web应用的主流框架之一。然而,由于其客户端渲染(CSR)的特性,React项目在搜索引擎优化(SEO)方面可能会遇到一些挑战。本文将详细介绍如何通过一系列策略和技术来增强React项目的SEO功能。
Front_Yue
2024/06/11
7260
React项目SEO优化实战:掌握这些技巧,提升网站排名!
WordPress免插件生成完整站点地图(sitemap.xml)的php代码
前言:站点地图(sitemap.xml)的作用,相信站长们都有所了解,我就不献宝了。而免插件生成 sitemap.xml,网络上也早就有了纯代码生成的方法。 一直以来,张戈博客都是用 DX-SEO 这个很好用的中文 SEO 插件生成的 sitemap。今天整理电脑文件时,看到了以前收藏的生成 sitemap.xml 的 php 脚本,就随手打开看了看,发现这个代码只能生成主页和文章页的 sitemap。果断百度了一下,发现网上分享的都大同小异,只有首页和文章页。感觉有点缺憾,反正今天也是闲着,就动手改造了一
张戈
2018/03/23
1.8K0
Next.js + 云开发Webify 打造绝佳网站
之前使用 Next.js + strapi 做了一个简单博客站点也顺道写了一篇 Next.js 简明教程,之后 Next 本身一直在迅猛发展。利用代 js 能力来说做到了:
腾讯云开发TCB
2021/09/10
1.6K0
Next.js + 云开发Webify 打造绝佳网站
wordpress站点地图(sitemap)纯代码无需插件自动生成
sitemap(xml)网站地图文件是非常关键的,因为这对搜索引擎收录是很有利的。
七辰
2023/10/04
2.1K0
wordpress站点地图(sitemap)纯代码无需插件自动生成
优化SPA:使得网站对SEO更友好
「传统网页开发模式」,网站内容(html)都是采用服务端渲染(SSR)的方式产出的。这样做,方便「爬虫」能够定位到网站内容。这个过程就是:爬虫发现你的网站内容,并且将其展现在大众面前。
前端柒八九
2022/08/25
2.7K0
优化SPA:使得网站对SEO更友好
如何更好地美化Django网站的Sitemap站点地图?
一般在Web网站开发完成之际,如果对搜索引擎优化(SEO)有一定的要求,我们都会为网站添加一个站点地图sitemap,配合robot.txt的使用,以汇总和索引网站上所有允许被搜索引擎搜索、采集和索引的网页,这样搜索引擎可以根据站点地图快速地爬取到一个网站上的所有希望被收录的网址。
州的先生
2020/03/19
1.5K0
如何更好地美化Django网站的Sitemap站点地图?
nuxt
Nuxt.js 是一个基于 Vue.js 的开源框架,旨在简化开发现代 Web 应用的工作流程。无论是服务端渲染 (SSR)、静态网站生成 (SSG),还是单页应用 (SPA),Nuxt.js 都提供了一套强大而灵活的解决方案。
阿超
2025/04/16
980
服务端渲染(SSR)与客户端渲染(CSR)详解
在早期 Web 时代,网页主要是静态 HTML 页面,用户点击链接后会刷新整个页面。随着网络与前端技术的发展,人们开始追求更好的页面性能与用户体验,尤其是在移动端和实时交互场景下,对于页面加载速度的要求不断提升。
创意锦囊
2025/01/15
8190
服务端渲染(SSR)与客户端渲染(CSR)详解
SEO优化实战
IMWeb前端团队
2018/01/08
1.6K0
SEO优化实战
相关推荐
WordPress 免插件生成最安全的纯静态站点地图(sitemap.xml)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档