首页 > 其他分享 >七、SPA单页面实现SEO优化之SSR服务器渲染

七、SPA单页面实现SEO优化之SSR服务器渲染

时间:2024-08-22 11:21:57浏览次数:12  
标签:app server js 服务器 SEO SPA SSR 客户端

前言:

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

通过上一篇文章可以了解到,Vue SPA单页面应用对SEO不友好,但是也有相应的解决方案。我了解到的SEO的实现方式有以下几种:
1.SSR服务器渲染;
2.静态化;
3.预渲染prerender-spa-plugin;
4.使用Phantomjs针对爬虫做处理。

其中SSR服务器渲染适用于构建大型网站,如商城类。如果是个人博客或者公司官网之类小型的网站,除SSR服务器渲染的其它方式都可以。如果对已用SPA开发完成的项目进行SEO优化,而且支持node服务器,建议使用Phantomjs。因为SSR服务器渲染存在一些坑点(主要是开发中会遇到许多坑点):

1.一套代码两套执行环境,会引起各种问题,比如服务端没有window、document对象,处理方式是增加判断。
2.因为没有任何动态更新,所以像 onMounted 或者 onUpdated 这样的生命周期钩子不会在 SSR 期间被调用,而只会在客户端运行。
3.Nuxt asyncData方法,初始化页面前先得到数据,但仅限于页面组件调用。
除此之外,开发中还会有很多代码细节需要调整,对于已经开发好的Vue单页面应用,十分不友好,SEO难度过大,必须要在一开始就定义好各种开发规范。

SSR基本操作步骤

应用渲染
让我们来看一个 Vue SSR 最基础的实战示例

1.创建一个新的文件夹,cd 进入
执行 npm init -y

2.在 package.json 中添加 “type”: “module” 使 Node.js 以 ES modules mode 运行

3.执行 npm install vue
创建一个 example.js 文件:

// 此文件运行在 Node.js 服务器上
import { createSSRApp } from 'vue'
// Vue 的服务端渲染 API 位于 `vue/server-renderer` 路径下
import { renderToString } from 'vue/server-renderer'

const app = createSSRApp({
  data: () => ({ count: 1 }),
  template: `<button @click="count++">{{ count }}</button>`
})

renderToString(app).then((html) => {
  console.log(html)
})

然后接着运行:

> node example.js

它应该会在命令行中打印出如下内容:

<button>1</button>

renderToString() 接收一个 Vue 应用实例作为参数,返回一个 Promise,当 Promise resolve 时得到应用渲染的 HTML。当然你也可以使用 Node.js Stream API 或者 Web Streams API 来执行流式渲染。查看 SSR API 参考获取完整的相关细节。

然后我们可以把 Vue SSR 的代码移动到一个服务器请求处理函数里,它将应用的 HTML 片段包装为完整的页面 HTML。接下来的几步我们将会使用 express.

执行 npm install express
创建下面的 server.js 文件:

import express from 'express'
import { createSSRApp } from 'vue'
import { renderToString } from 'vue/server-renderer'

const server = express()

server.get('/', (req, res) => {
  const app = createSSRApp({
    data: () => ({ count: 1 }),
    template: `<button @click="count++">{{ count }}</button>`
  })

  renderToString(app).then((html) => {
    res.send(`
    <!DOCTYPE html>
    <html>
      <head>
        <title>Vue SSR Example</title>
      </head>
      <body>
        <div id="app">${html}</div>
      </body>
    </html>
    `)
  })
})

server.listen(3000, () => {
  console.log('ready')
})

最后,执行 node server.js,访问 http://localhost:3000。就看到页面中的按钮了。

客户端激活
如果你点击该按钮,你会发现数字并没有改变。这段 HTML 在客户端是完全静态的,因为我们没有在浏览器中加载 Vue。

为了使客户端的应用可交互,Vue 需要执行一个激活步骤。在激活过程中,Vue 会创建一个与服务端完全相同的应用实例,然后将每个组件与它应该控制的 DOM 节点相匹配,并添加 DOM 事件监听器。

为了在激活模式下挂载应用,我们应该使用 createSSRApp() 而不是 createApp():

// 该文件运行在浏览器中
import { createSSRApp } from 'vue'

const app = createSSRApp({
  // ...和服务端完全一致的应用实例
})

// 在客户端挂载一个 SSR 应用时会假定
// HTML 是预渲染的,然后执行激活过程,
// 而不是挂载新的 DOM 节点
app.mount('#app')

代码结构​
想想我们该如何在客户端复用服务端的应用实现。这时我们就需要开始考虑 SSR 应用中的代码结构了——我们如何在服务器和客户端之间共享相同的应用代码呢?

这里我们将演示最基础的设置。首先,让我们将应用的创建逻辑拆分到一个单独的文件 app.js 中。

// app.js (在服务器和客户端之间共享)
import { createSSRApp } from 'vue'

export function createApp() {
  return createSSRApp({
    data: () => ({ count: 1 }),
    template: `<button @click="count++">{{ count }}</button>`
  })
}

该文件及其依赖项在服务器和客户端之间共享——我们称它们为通用代码。编写通用代码时有一些注意事项,我们将在下面讨论。

我们在客户端入口导入通用代码,创建应用并执行挂载:

// client.js
import { createApp } from './app.js'

createApp().mount('#app')

服务器在请求处理函数中使用相同的应用创建逻辑:

// server.js (不相关的代码省略)
import { createApp } from './app.js'

server.get('/', (req, res) => {
  const app = createApp()
  renderToString(app).then(html => {
    // ...
  })
})

此外,为了在浏览器中加载客户端文件,我们还需要:

1.在 server.js 中添加 server.use(express.static(‘.’)) 来托管客户端文件。

2.将 添加到 HTML 外壳以加载客户端入口文件。

3.通过在 HTML 外壳中添加 Import Map 以支持在浏览器中使用 import * from ‘vue’。

按钮现在可以交互了。

标签:app,server,js,服务器,SEO,SPA,SSR,客户端
From: https://blog.csdn.net/qq_44849312/article/details/141421756

相关文章

  • YSP_refs_cn_2011_SpA
    rhTNFR-Fc中文文献-2011-SpA 脊柱关节炎 随机对照试验[1-7][1]陈梅卿,陈娟,孙华瑜,等.重组人Ⅱ型肿瘤坏死因子受体-抗体融合蛋白治疗强直性脊柱炎的减量探索.中国实用医药,2011,06(25):1-3.浏览文摘[2]陈庆花,杨永红,邱悦群,等.益赛普治疗强直性脊柱炎有效性和......
  • Spark超全笔记 一站式搞定!!
    sparkSparkSpark和Hadoop的区别Spark计算流程Spark组成架构(spark的五大组件)Spark内核调度流程Spark并行度RDDRDD的五大特性RDD的创建RDD常用算子常用transformation算子常用action算子RDD缓存和checkpoint对比RDD依赖依赖管理DAG有向无环图为什么要进行stage划分Spar......
  • YSP_refs_cn_2010_SpA
    rhTNFR-Fc中文文献-2010-SpA 脊柱关节炎 随机对照试验[1–11][1]陈慕芝,照日格图,王海云,等.重组人Ⅱ型肿瘤坏死因子受体-抗体融合蛋白与传统免疫抑制剂治疗强直性脊柱炎的临床对照研究.新疆医科大学学报,2010,33(8):913-915.浏览文摘[2]冯艳广,王俊丽,王慧......
  • linux容器基础-namespace-3(pid)
    pidnamespacepidnamespace表示隔离一个具有独立PID的运行环境。在每一个pidnamespace中,进程的pid都从1开始,且和其他pidnamespace中的PID互不影响。这意味着,不同pidnamespace中可以有相同的PID值。在介绍pidnamespace之前,先创建其他类型的namespace然后查看进程关......
  • YSP_refs_cn_2008_SpA
    rhTNFR-Fc中文文献-2008-SpA 脊柱关节炎 随机对照临床试验 [1–7] [1]高冠民,刘升云,蒋莉,等.关节腔注射益赛普治疗强直性脊柱炎合并膝关节炎的疗效观察[J/OL].中国误诊学杂志,2008,8(16):3836-3837[2024-08-20].浏览文摘[2]黄烽,邓小虎,张亚美,等.重组......
  • 知识图谱——CiteSpace梳理学术脉络
    CiteSpace是一款强大的可视化分析软件,专门用于分析和可视化科学文献中的引文网络,以帮助识别科学领域的知识结构、研究前沿和发展趋势。下面我将详细介绍如何使用CiteSpace进行学术脉络梳理,并给出一个具体的例子。CiteSpace简介CiteSpace是一款免费的软件,它基于Java开发,可以用......
  • OpenCV(cv::SparseMat)
    目录1.主要特点和用途2.主要方法和成员函数3.示例代码4.优缺点cv::SparseMat是OpenCV中表示稀疏矩阵的类。稀疏矩阵用于存储大多数元素为零的矩阵,以节省内存和计算时间。与普通的密集矩阵不同,稀疏矩阵仅存储非零元素及其坐标。1.主要特点和用途稀疏数据存储:当......
  • 计算机毕业设计Python深度学习游戏推荐系统 Django PySpark游戏可视化 游戏数据分析
    基于Spark的TapTap游戏数据分析系统技术栈:  -python  -django  -scrapy  -vue3  -spark  -element-plus  -echarts   功能板块:0.爬虫模块:  通过scrapy抓取taptap游戏网站数据,从分类页开始抓取全站游戏的数据1.首页......
  • ssrf 内网访问 伪协议 读取文件 端口扫描
    SSRF(Server-SideRequestForgery,服务器侧请求伪造)是一种利用服务器发起网络请求的能力来攻击内网资源或执行其他恶意活动的技术。SSRF可以用于访问通常不可由外部直接访问的内网资源,读取文件,甚至进行端口扫描。以下是关于SSRF在CTF中针对内网访问、伪协议读取文件和端口扫描的......
  • Spark MLlib 特征工程系列—特征提取LSH(BucketedRandomProjectionLSH)
    SparkMLlib特征工程系列—特征提取LSH(BucketedRandomProjectionLSH)在这篇文章中,我们将深入探讨Spark中的BucketedRandomProjectionLSH,这是一种用于近似最近邻搜索的技术。文章将覆盖其工作原理、应用场景、Scala代码示例、参数调优以及使用效果分析,确保内容全面、......