八、SPA单页面实现SEO优化之预渲染prerender-spa-plugin

news2024/9/29 9:38:28

文章目录

    • 一、前言
    • 二、prerender-spa-plugin预渲染方式实现SEO
      • 插件介绍
      • 实现步骤

一、前言

关于SPA和SEO优化、SSR服务器渲染的介绍可以参考这里:
六、什么是SEO优化(搜索引擎优化)?SPA单页面应用如何实现SEO优化?

通过上一篇文章我们介绍了服务端渲染的方式来实现单页面应用的SEO优化。但是,服务端渲染的方式对开发并不友好,它需要约定各种规范,比较适合开发大型网站。
对于一些微型网站,比如个人博客,或者公司的小型应用网站,路由数量,页面数量并不多,我们可以使用prerender-spa-plugin预渲染来实现SPA单页面的SEO优化。
它的优点是简单方便,不需要改动太多原来的项目内容。

二、prerender-spa-plugin预渲染方式实现SEO

插件介绍

这里要介绍的是基于prerender-spa-plugin与vue-meta-info的一套官网前端SEO预渲染方案。

prerender-spa-plugin
prerender-spa-plugin是一个webpack插件,其作用是将渲染的页面固化成HTML文件。原理是利用无头浏览器(puppeteer)遍历配置中的路由,在收到结束的事件时,将当时的页面数据输出成HTML文件。

vue-meta-info
vue-meta-info是一个能在vue中使用的工具,能在vue文件中动态更改当前页面的meta中的信息(例如title,description等)。

将二者结合,就可以做到动态渲染页面内容,并输出html文件。

实现步骤

我们先看一下未预渲染之前,我们的Vue项目打包后的内容:
在这里插入图片描述
在这里插入图片描述
可以发现,我们的网站应用只有一个html页面,而且网站的主要组件内容都没有在这个html页面上显示,都需要运行里面的js文件,才能够渲染出具体的网站内容。
而搜索引擎的爬虫,是不会运行这些js文件的,因而我们网站的关键字信息会非常少,外界几乎不可能根据这点信息搜索到我们的网站。
下面我们开始使用prerender-spa-plugin和vue-meta-info来做SEO优化把!

1.安装prerender-spa-plugin

cnpm i @dreysolano/prerender-spa-plugin

这里要注意啦,不是 官方的cnpm install prerender-spa-plugin 这个库,这个库有些插件没更新,因此后面打包会报错的,我也是踩坑查资料才解决的。

2.在vue.config.js里加入插件的配置信息
该配置直接加到

configureWebpack: config => {
    if (process.env.NODE_ENV !== 'production') return
    // const PrerenderSPAPlugin = require('prerender-spa-plugin')
    const PrerenderSPAPlugin = require('@dreysolano/prerender-spa-plugin')
    const Renderer = PrerenderSPAPlugin.PuppeteerRenderer;
    const path = require('path');
    return {
      plugins: [
        new PrerenderSPAPlugin({
          // 生成文件的路径,也可以与webpakc打包的一致。     
          // 这个目录只能有一级,如果目录层次大于一级,在生成的时候不会有任何错误提示,在预渲染的时候只会卡着不动。
              staticDir: path.join(__dirname,'dist'),
              // 对应自己的路由文件,比如a有参数,就需要写成 /a/param1。
              routes: ['/','/home','/user'],
              // 这个很重要,如果没有配置这段,也不会进行预编译
              renderer: new Renderer({
                  inject: {
                      foo: 'bar'
                  },
                  headless: false,
                  // 在 main.js 中 document.dispatchEvent(new Event('render-event')),两者的事件名称要对应上。
                  renderAfterDocumentEvent: 'render-event',
                  renderAfterTime:5000
                  
              })
          })
      ]
    }
  }

在这里插入图片描述

2.router.js配置
项目中的路由必须配置成history模式

const router = new VueRouter({
  mode: 'history',
  base: process.env.NODE_ENV === 'development' ? '' : '/',
  scrollBehavior: () => ({
    y: 0
  }),
  routes
})

在这里插入图片描述
3.main.js配置预渲染启动

/* 这句非常重要,否则预渲染将不会启动 */
  mounted () {
    document.dispatchEvent(new Event('render-event')) // 触发
  }

在这里插入图片描述

4.vue-meta-info安装

cnpm i vue-meta-info --save

5.main.js引入vue-meta-info
找到main.js文件加入以下代码

import MetaInfo from 'vue-meta-info'
Vue.use(MetaInfo)

6.可以在各个vue页面里面配置属于自己的meta标签
如下

<script>
export default {
  // 配置title和meta数据
  metaInfo: {
    title: 'title',
    meta: [
      {
        name: 'keywords',
        content: '关键字'
      },
      {
        name: 'description',
        content: '描述'
      }
    ]
  },
  data () {
    return {}
  }
}
</script>

7.打包

npm run build

打包的过程中,google浏览器会自动弹出打包的测试页面,因而电脑上要安装goole浏览器哦!
在这里插入图片描述
在这里插入图片描述
打包成功后,我们发现打包文件夹已经发生变化,在我们配置的路由下会生成对应的html页面。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2066635.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C/C++语言基础--字符串(包括字符串与字符数组、字符串与指针、字符串处理函数等),代码均可运行

本专栏目的 更新C/C的基础语法&#xff0c;包括C的一些新特性 前言 无论什么语言&#xff0c;字符串都是最重要、最基础的数据类型&#xff0c;他对二进制有很好的对应关系在C语言中没有提供专门的处理字符串的类型&#xff0c;但是我们可以通过字符数组、开辟内存地址来处理…

Content-Encoding: br

爬虫的时候遇到了 Content-Encoding: br &#xff0c; 这可能会导致返回的数据有乱码&#xff0c;无法解析&#xff0c;也无法解码&#xff0c; 浏览器显示编码 按照这么写&#xff0c;还是乱码 查了很久&#xff0c;需要在请求头 Accept-Encoding 将这个改为gzip&#xff0c…

Swift 6.0 如何更优雅的抛出和处理特定类型的错误

概述 从 Swift 语言诞生那天儿起&#xff0c;它就不厌其烦一遍又一遍地向秃头码农们诉说着自己的类型安全和高雅品味。 不过遗憾的是&#xff0c;作为 Swift 语言中错误处理这最为重要的一环却时常让小伙伴们不得要领、满腹狐疑。 在本篇博文中&#xff0c;您将学到如下内容&…

企业数字化转型会面临哪些挑战,如何解决?

当前&#xff0c;数字技术发展迅速&#xff0c;已迈入 AI 人工智能时代。企业若不进行数字化转型&#xff0c;可能会被用户抛弃、被竞争对手超越。那么&#xff0c;传统企业在转型过程中会遇到哪些挑战呢&#xff1f; 一、企业数字化转型面临的挑战 1、缺乏明确的战略规划和转…

宠物空气净化器除臭吗?性价比高的宠物空气净化器十大排名分享

来来来&#xff0c;先带大家一睹我店里的小可爱们 是不是超级可爱呀~&#xff1f;这样的大卡车猫猫&#xff0c;在我这猫咖里可是还有好几十只&#xff01;作为一位坐拥几十只猫咪的“猫咖掌门”&#xff0c;朋友们总是投来羡慕的目光。但这份光鲜背后&#xff0c;可是有我无数…

轻松制作 GIF 动图,你也可以!

你是否曾为找不到合适的动图而烦恼&#xff1f; 是否羡慕别人能制作出精彩的 GIF 动图&#xff1f; 现在&#xff0c;无需再羡慕&#xff01;因为我们用以下图片中的方法&#xff0c;你自己也能轻松制作 GIF 动图。 这款工具&#xff0c;操作简单易懂&#xff0c; 即使你没有…

舞动奇迹,亨廷顿舞蹈症患者专属健身秘籍!

&#x1f308; 在小红书的温馨角落里&#xff0c;让我们一起探索一个特别的世界——为亨廷顿舞蹈症&#xff08;HD&#xff09;患者量身定制的健身之旅。HD&#xff0c;这个名字或许带着一丝沉重&#xff0c;但它绝不能定义我们生活的全部色彩。通过科学的锻炼方式&#xff0c;…

APP逆向百例五-Flutter逆向案例----某次元(AES+RSA)

现在售价依旧是99&#xffe5;,计划更新100案例&#xff0c;平均一个案例1块钱&#xff0c;要什么自行车&#xff01; 还原一下我逆向此app的方法 1.抓包分析&#xff1a; 我这边用socksDroid抓不到数据包,但是小黄鸟可以&#xff0c;那就用Reqable结合电脑端进行抓包,不纠结…

Leetcode 347. 前 K 个高频元素

解法&#xff1a; 字典统计排序 class Solution:def topKFrequent(self, nums: List[int], k: int) -> List[int]:cont {}for eve in nums:if eve not in cont: cont[eve] 1else: cont[eve] 1contlist sorted(cont.items(), keylambda x: x[1])res [eve[0] for eve i…

从安装Docker到打包迁移MySQL的完整指南

从安装Docker到打包迁移MySQL的完整指南 每一天过得充实&#xff0c;眼中无迷茫&#xff0c;心中无烦恼。日子就会充满希望&#xff0c;岁月就会洒满清欢。 这篇文章将带你从零开始&#xff0c;在CentOS服务器上安装Docker、使用Docker部署MySQL数据库&#xff0c;并打包和迁移…

凯迪仕智能锁携手唐百电器达成战略合作,市场布局和拓展再加速

近日&#xff0c;凯迪仕智能锁中国区总裁陈露拜访唐山百货大楼集团&#xff08;唐百电器&#xff09;&#xff0c;双方深入交流资源优势&#xff0c;结合唐山市场实际情况达成2024年-2025年度深度战略合作&#xff0c;并完成首次签约千余套凯迪仕智能锁战略目标&#xff0c;接下…

【java计算机毕设】中小型人力资源管理系统MySQL ssm vue maven项目设计源代码带项目报告 前后端可分离可不分离

目录 1项目功能 2项目介绍 3项目地址 1项目功能 【java计算机毕设】中小型人力资源管理系统MySQL ssm vue maven项目设计源代码带项目报告 前后端可分离可不分离 2项目介绍 系统功能&#xff1a; 中小型人力资源管理系统包括管理员、人事管理员、普通人员三种角色。 管理员…

【JS】不使用BigInt实现大整数相加

前言 JS中整数有存储范围&#xff0c;一旦超出这个范围则会丢失精度&#xff0c;通过MAX_SAFE_INTEGER可以看到JS中支持的最大的、安全的正整数为9007199254740991。 JS新类型BigInt可以处理大整数运算&#xff0c;但这次不逃课&#xff0c;本文将尝试自行处理大整数相加&…

python安装包,2024最新Python下载环境配置教程!

一、Python安装包下载 1.进入Python官网下载&#xff08;如果不想去官网下载可以点击领取安装包&#xff09; Python官网主要有python的About (简介)、Downloads (下载)、Documentation(文档)、Community (团体)、Success Stories (成功案例)、News (新闻)、Events (事件动态…

Windows微调Qwen2-7B-Instruct-甄嬛

一、下载Anaconda 在下载Anaconda之前建议先将电脑原有的python卸载&#xff0c;避免造成冲突。 之后一直Next即可&#xff0c;不过要记得在环境变量中添加Anaconda&#xff08;在安装完成之前会有一个Add PATH选项&#xff0c;可以选上&#xff09; 安装完成之后打开CMD&…

3.2.5 宙之CPU的时分复用

点击查看系列文章 》 Interrupt Pipeline系列文章大纲-CSDN博客 3.2.5.1 __primary_switched开始构建0号进程 宙者&#xff0c;古往今来&#xff0c;时间为宙。盘古为了开天辟地&#xff0c;必须分开空间和时间。在时间维度&#xff0c;要对CPU的运行时间进行切分&#xff0c;…

netty编程之自定义编解码器

写在前面 源码 。 本文看下netty如何自定义编解码器。为此netty专门定义抽象类io.netty.handler.codec.MessageToByteEncoder和io.netty.handler.codec.ByteToMessageDecoder,后续我们实现自定义的编解码器就继承这两个类来做。 1&#xff1a;正戏 server 启动类&#xff1a…

卖一辆亏6万搞倾销,极越汽车高管掀了小米汽车遮羞布?

"炮轰解决不了极越销量问题" 作者 | 魏 强 编辑 | 卢旭成 8月22日早9点40分&#xff0c;极越汽车公关负责人徐继业发朋友圈炮轰小米汽车创始人雷军&#xff1a;“雷军这样的企业家&#xff0c;有点公德心和羞耻心好不好&#xff1f;每台车亏6万&#xff0c;亏那么…

Springboot中的mapper与entity难以觉察的匹配问题,困扰我几天时间,形成很大的压力!

最近&#xff0c;应好友邀请&#xff0c;替她做了一个心理疗愈项目的小系统&#xff0c;在编制后台API代码时&#xff0c;遇到了一个不易觉察的问题&#xff0c;终于查找出来&#xff0c;并且解决了&#xff0c;现奉献出来&#xff0c;供大家碰到类似问题&#xff0c;进行参考。…

面试题详解

前言&#xff1a;这一期我们专门来巩固所学知识&#xff0c;同时见识一些面试题。对知识做出一个总结。 1 不创建临时变量交换两个整数 . 第一种方法 #include<stdio.h> int main() {int a 0;int b 0;scanf("%d %d", &a, &b);printf("交换前…