使用过 Vue SSR 吗?说说 SSR?
先说下基本概念:
ssr 的全称是 server side render,服务端渲染,vue ssr 的意思就是在服务端进行 vue 的渲染,直接对前端返回带有数据,并且是渲染好的HTML页面;
而不是返回一个空的HTML页面,再由vue 通过异步请求来获取数据,再重新补充到页面中。
这么做的最主要原因,就是搜索引擎优化,也就是SEO,这更利于网络爬虫去爬取和收集数据。
为什么这样就有利于网络爬虫爬取呢?
这里简单说一下爬虫的爬取方式,爬虫通过访问 URL 获取一个页面后,会获取当前HTML中已存在的数据,也可以理解为把拿到的 HTML 页面转为了字符串内容,然后解析、存储这些内容,但是如果页面中有些数据是通过异步请求获得的,那么爬虫是不会等待异步请求返回之后才结束对页面数据的解析的,这样就会没有爬取到这部分数据,很不利于其他搜索引擎的收录。
这也就是为什么单页面网站是不具备良好的SEO效果的,因为单页面返回的就是一个基本为空的 HTML 文件,里面就一个带有ID的元素等待挂载而已,页面的内容都是通过 js 后续生成的,比如这样:
<!DOCTYPE html>
<html lang="en">
<head><title>Hello</title></head>
<body><div id="app"></div></body>
<script src="bundle.js"></script>
</html>
但对于很多公司来说,公司的产品是希望能被百度、谷歌等搜索引擎收录之后,进行排名,进一步的被用户搜索到,能更利于品牌的推广、流量变现等操作,要实现这些,就必须保证产品的网页是能够被网络爬虫爬取到的,显然一个完整的带有全部数据的页面更利于爬虫的爬取,当然现在也有很多方法可以去实现针对页面异步数据的爬取,github 上也开源了很多的爬虫代码,但是这显然对于爬虫来说更加的不友好、成本更高。
SSR 当然也是有着其他的好处的,比如首屏页面加载速度更快,用户等待时间更短等,其他更多概念可以查看官网 https://ssr.vuejs.org/zh/ ,这些官网上都有介绍。
代码实现
下面我们结合官网上的代码,做一下代码实操,来加深下理解:
在官网中,提供了一个使用模块 vue-server-renderer 简单实现 vue 服务端渲染的示例:
新建一个文件夹vue-ssr-demo,进入其中执行如下命令:
// 安装模块
npm install vue vue-server-renderer --save
创建文件 server.js
// vue-ssr-demo/server.js 示例代码 //第一步,创建vue实例
const Vue = require('vue');
const app = new Vue({
template: "<div>hello world</div>"
}); //第二步,创建一个renderer
const renderer = require('vue-server-renderer').createRenderer();
//第三步,将vue渲染为HTML
renderer.renderToString(app, (err, html)=>{
if(err){
throw err;
}
console.log(html);
});
保存以上代码后,在 vue-ssr-demo 文件夹下打开命令行工具,执行 node server.js 命令,可得到如下 HTML 内容:
➜ vue-ssr-demo node server.js
<div data-server-rendered="true">hello world</div>
好,上面的例子中我们已经让 vue 在服务端,也就是 node 环境下运行起来了,到这里其实已经实现了 vue 的服务端渲染了。
可是,实际项目中使用哪有这么简单,起码数据还没渲染啊,那接下来我们看看如何渲染数据:
vue-ssr 渲染数据的方式有两种,我们先看下第一种:
// server.js
const data_vue = {
word: 'Hello World!'
};
//第一步,创建vue实例
const Vue = require('vue');
//vue 实例化过程中插入数据
const app = new Vue({
data: data_vue,
template: "<div>{{word}}</div>"
}); //第二步,创建一个renderer
const renderer = require('vue-server-renderer').createRenderer(); //第三步,将vue渲染为HTML
renderer.renderToString(app, (err, html)=>{
if(err){
throw err;
}
console.log(html);
});
第一种方式,在创建 vue 实例时,将需要的数据传入 vue 的模板,使用方法与客户端 vue 一样;运行 server.js 结果如下,数据 data_vue 已经插入到 vue 模板里面了:
➜ vue-ssr-demo node server.js
<div data-server-rendered="true">Hello World!</div>
第二种,模板插值,这里我们也直接先放代码:
const data_vue = {
word: 'Hello World!'
};
const data_tpl = {
people: 'Hello People!'
};
//第一步,创建vue实例
const Vue = require('vue');
const app = new Vue({
data: data_vue,
template: "<div>{{word}}</div>"
}); //第二步,创建一个 renderer 实例
const renderer = require('vue-server-renderer').createRenderer({
template: "<!--vue-ssr-outlet--><div>{{people}}</div>"
}); //第三步,将vue渲染为HTML
renderer.renderToString(app, data_tpl, (err, html)=>{
if(err){
throw err;
}
console.log(html);
});
这里我们增加了数据 data_tpl,你会发现,在 renderToString 方法中传入了这个参数,那么这个参数作用在哪里呢?这就要看下官网中关于 createRenderer 和 renderToString 方法的介绍了,
createRenderer: 使用(可选的)选项创建一个 Renderer 实例。
const { createRenderer } = require('vue-server-renderer')
const renderer = createRenderer({ / 选项 / })
在选项中,就有一个参数叫 template,看官网怎么说的:
template: 为整个页面的 HTML 提供一个模板。此模板应包含注释 <!--vue-ssr-outlet-->,作为渲染应用程序内容的占位符。
为整个页面的 HTML 提供一个模板。此模板应包含注释 <!--vue-ssr-outlet-->,作为渲染应用程序内容的占位符。 模板还支持使用渲染上下文 (render context) 进行基本插值: 使用双花括号 (double-mustache) 进行 HTML 转义插值 (HTML-escaped interpolation);
使用三花括号 (triple-mustache) 进行 HTML 不转义插值 (non-HTML-escaped interpolation)。
根据介绍,在创建 renderer 实例时,可以通过 template 参数声明一个模板,这个模板用来干嘛呢?就用来挂载 vue 模板渲染完成之后生成的 HTML。这里要注意一下,当创建 renderer 实例时没有声明 template 参数,那么默认渲染完就是 vue 模板生成的 HTML;当创建 renderer 实例时声明了 template 参数,一定要在模板中增加一句注释 “<!--vue-ssr-outlet-->” 作为 vue 模板插入的占位符,否则会报找不到插入模板位置的错误。
再次运行 server.js ,结果如下,vue 模板已成功插入,且 template 模板中的 {{people}} 变量也因在 renderToString 方法中第二位参数的传入,显示了数据:
➜ vue-ssr-demo node server.js
<div data-server-rendered="true">Hello World!</div><div>Hello People!</div>
如果我们把 template 换成一个 HTML 页面的基本架构,来包裹 vue 模板,是不是就能得到一个完整页面了呢?我们来试一下:
const data_vue = {
word: 'Hello World!'
};
const data_tpl = {
people: 'Hello People!'
};
//第一步,创建vue实例
const Vue = require('vue');
const app = new Vue({
data: data_vue,
template: "<div>{{word}}</div>"
}); //第二步,创建一个renderer
const renderer = require('vue-server-renderer').createRenderer({
template: `<!DOCTYPE html>
<html lang="en">
<head><title>Hello</title></head>
<body>
<!--vue-ssr-outlet--><div>{{people}}</div>
</body>
</html>`
}); //第三步,将vue渲染为HTML
renderer.renderToString(app, data_tpl, (err, html)=>{
if(err){
throw err;
}
console.log(html);
});
运行 server.js ,结果如下,我们得到了一个完整的 HTML 页面,且成功插入了数据:
➜ vue-ssr-demo node server.js
<!DOCTYPE html>
<html lang="en">
<head><title>Hello</title></head>
<body>
<div data-server-rendered="true">Hello World!</div><div>Hello People!</div>
</body>
</html>
好,现在页面生成了,该怎么显示呢?这里我们借助下框架 Koa 实现,先来安装:
npm install koa -S
然后修改 server.js ,如下:
const data_vue = {
word: 'Hello World!'
};
const data_tpl = {
people: 'Hello People!'
}; const Koa = require('koa');
//创建 koa 实例
const koa = new Koa(); const Vue = require('vue'); //创建一个renderer
const renderer = require('vue-server-renderer').createRenderer({
template: `<!DOCTYPE html>
<html lang="en">
<head><title>Hello</title></head>
<body>
<!--vue-ssr-outlet--><div>{{people}}</div>
</body>
</html>`
}); // 对于任何请求,app将调用该异步函数处理请求:
koa.use(async (ctx, next) => {
// await next(); //创建vue实例
const app = new Vue({
data: data_vue,
template: "<div>{{word}}</div>"
}); //将vue渲染为HTML
const body = await renderer.renderToString(app, data_tpl);
ctx.body = body;
}); // 在端口3001监听:
koa.listen(3001);
console.log('app started at port 3001...');
运行 server.js :
➜ vue-ssr-demo node server.js
app started at port 3001...
然后打开浏览器,输入网址 http://localhost:3001/ ,即可看到运行后的效果。
这样就实现了一个简单的服务端渲染项目,但是我们在平常开发的时候,肯定不会这么简单的去构建一个项目,必然会用到一些,比如打包、压缩的工具,这篇就写到这里,下一篇我们尝试使用 webpack 来构建一个 vue 的服务端渲染项目。
https://segmentfault.com/a/1190000016637877
使用过 Vue SSR 吗?说说 SSR?的更多相关文章
- 入职第一天:前端leader手把手教我入门Vue服务器端渲染(SSR)
继前段时间西安电面之后顺利拿到了OFFER,今天(5月2号)是我入职第一天,在简短的内部培训了一上午后,前端leader让我先了解下什么是vue的服务器端渲染(SSR). SSR,英文全称叫 Serv ...
- 转载一篇好理解的vue ssr文章
转载:原文链接https://www.86886.wang/detail/5b8e6081f03d630ba8725892,谢谢作者的分享 前言 大多数Vue项目要支持SSR应该是为了SEO考虑,毕竟 ...
- vue ssr服务端渲染
SSR:Server Side Rendering(服务端渲染) 目的是为了解决单页面应用的 SEO 的问题,对于一般网站影响不大,但是对于论坛类,内容类网站来说是致命的,搜索引擎无法抓取页面相关内容 ...
- 理解vue ssr原理,自己搭建简单的ssr框架
前言 大多数Vue项目要支持SSR应该是为了SEO考虑,毕竟对于WEB应用来说,搜索引擎是一个很大的流量入口.Vue SSR现在已经比较成熟了,但是如果是把一个SPA应用改造成SSR应用,成本还是有些 ...
- 通过vue-cli3构建一个SSR应用程序
1.前沿 1.1.什么是SSR SSR(服务端渲染)顾名思义就是将页面在服务端渲染完成后在客户端直接展示. 1.2.客户端渲染与服务端渲染的区别 传统的SPA模式 即客户端渲染的模式 Vue.js构建 ...
- 从单页应用(SPA)到服务器渲染(SSR)
从单页应用(SPA)到服务器渲染(SSR) 情景回顾 在学习Vue开发一个电商网站的管理后台时,使用到了一个组件 vue-quill-editor 主要是一个快捷的一个富文本编辑器 在使用这个组件的组 ...
- CSR,SSR,PreRender原理解密
CSR.SSR.Prerender 原理全解密 做前端的同学们肯定或多或少听说过CSR,SSR,Prerender这些名词,但是大多肯定只是停留在听说过,了解过,略懂一点,但是,你真的理解这些技术 ...
- 自建梯子教程:vultr+ssr+SwitchyOmega
1 综述 在饱受蓝灯挂掉之苦半个月后,终于决定自己搭建VPS服务器FQ了.虽然网上VPS服务器教程很多,但是我按照那些教程弄好VPS服务器总是不稳定,用着用着就不能用了.这应该是这次GFW升级带来的后 ...
- 自建ssr(谷歌云免费试用一年)
近期我一个朋友的VPN到期了,他也不想再去续费,同时发现谷歌云第一年申请时是免费的,所以他就自己搭建了一个自己专属的VPN 以下是他的搭建教程: 本教程难点在于申请免费试用资格 谷歌云+ssr搭建免 ...
- SPA SEO SSR三者有什么区别
SPA通俗的说就是单页面应用(single page application) 优点 页面之间的切换非常快 一定程度减少了后端服务器的压力 后端程序只需要提供api,不需要客户端到底是web端还是手机 ...
随机推荐
- linux文本三剑客之awk详解
linux文本三剑客之awk详解 目录 linux文本三剑客之awk详解 1.awk命令详解 1.1 awk的处理流程 1.2 awk中的变量 1.2.1 内置变量 1.2.2 自定义变量 1.3 a ...
- 智能工作流:Spring AI高效批量化提示访问方案
基于SpringAI搭建系统,依靠线程池\负载均衡等技术进行请求优化,用于解决科研&开发过程中对GPT接口进行批量化接口请求中出现的问题. github地址:https://github.co ...
- Lua热更学习--使用toLua中的协程
[6] C#访问调table类中的成员变量和函数 访问table中的变量和函数 lua中可以使用table作为class,因此对table中的函数访问调用是必要的根据前面对table访问和functi ...
- 移动端termux安装kali
1.相关准备一部安卓手机,termux,NVAC,浏览器2.安装kali首先进入kali的官网选择文档找到Android手机上的kali找到NetHunter-Rootless找到kali安装命令:t ...
- C语言:通讯录程序设计(多功能)
回顾我的代码shi 通讯录程序设计 主函数 遇到的困难 补充标注说明(一定要看) 效果展示截图 结语 程序源代码 通讯录程序设计 作者前言:该通讯录作品是我大一的C语言结课作业,代码像shi山一样,之 ...
- mini-centos7 环境安装部署,各种踩坑。。。
最小Linux系统,安装Java环境 想想就生气,去面试个运维,面试官让我上机装个centos7,还是个最小安装包连界面都没有,只有命令行模式,我都哭了,然后让把一些环境装一下,然后再部署个sprin ...
- java学习之旅(day.17)
GUI编程 GUI:图形用户界面编程 GUI快淘汰了 GUI的核心技术:Swing . AWT 这是类 做一个场景页面涉及的组件 窗口.弹窗.面板.文本框.列表框.按钮.图片.监听事件.鼠标.键盘.破 ...
- redis持久化存储数据(rdb和aof)
rdb持久化存储数据 总的 redis持久化 防止数据丢失,持久化到本地,以文件形式保存 持久化的方式 ,两种 aof和 rdb模式 1.触发机制, - 手动执行save命令 - 或者配置触发条件 s ...
- 大数据之Hadoop的HDFS存储优化—异构存储(冷热数据分离)
异构存储主要解决,不同的数据,储存在不同类型的硬盘中,达到最佳性能的问题 1)存储类型 RAM_DISK:内存镜像文件系统 SSD:SSD固态硬盘 DISK:普通磁盘,在HDFS中,如果没有主动声明数 ...
- 【winform】【Socket】实现你画我猜一:核心功能开发
我认为得核心:是把客户端画的图画实时传递给其他的客户端. 我的思路是: 1.GDI+绘图加鼠标事件,实现客户端绘图. 2.每记录鼠标有效绘图10个点,就把这10个点通过socket传递给服务器. ...