当前位置: 首页 > news >正文

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

文章目录

    • 一、前言:
    • 二、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’。

按钮现在可以交互了。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 8.17day bug
  • 国际校企合作|深信服、常州信息职业技术学院、马来西亚汽车工业大学三方国际化人才培养合作签约仪式圆满成功
  • 机器学习辅助复合材料预测,性能管理优化创新材料,这种王炸般的组合,还真是大开眼界!
  • XSS- - - DOM 破坏案例与靶场
  • java 中的设计模式
  • 【STM32】RTT-Studio中HAL库开发教程五:UART的DMA应用
  • 01 SSH--
  • Verilog刷题笔记57
  • 用Python插入SVG到PDF文档
  • WindowManager的使用
  • Django 后端架构开发:高效日志规范与实践
  • 85.游戏改造-修改UI分辨率,面向对象方式
  • Android自定义一个带背景的圆环形进度条(Kotlin)
  • 如何解决大数据背景下的数据治理挑战
  • Oracle PL/SQL存储过程和函数简单示例
  • [译]CSS 居中(Center)方法大合集
  • 0x05 Python数据分析,Anaconda八斩刀
  • Effective Java 笔记(一)
  • exif信息对照
  • HTTP请求重发
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Terraform入门 - 1. 安装Terraform
  • Vue.js 移动端适配之 vw 解决方案
  • 从零开始的无人驾驶 1
  • 从零开始学习部署
  • 大快搜索数据爬虫技术实例安装教学篇
  • 仿天猫超市收藏抛物线动画工具库
  • 分类模型——Logistics Regression
  • 分享几个不错的工具
  • 给新手的新浪微博 SDK 集成教程【一】
  • 如何实现 font-size 的响应式
  • 删除表内多余的重复数据
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 世界上最简单的无等待算法(getAndIncrement)
  • 通过几道题目学习二叉搜索树
  • 我感觉这是史上最牛的防sql注入方法类
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​linux启动进程的方式
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • # dbt source dbt source freshness命令详解
  • #include<初见C语言之指针(5)>
  • #宝哥教你#查看jquery绑定的事件函数
  • (LeetCode) T14. Longest Common Prefix
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (二)Eureka服务搭建,服务注册,服务发现
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .net 反编译_.net反编译的相关问题
  • .NET 中创建支持集合初始化器的类型
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .net分布式压力测试工具(Beetle.DT)
  • [20190416]完善shared latch测试脚本2.txt