落霞与孤鹜齐飞,秋水共长天一色。
百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 互联网 > 技术教程 > 正文

关于Vue SSR不可不知的问题

jellybean 2023-05-02 28 浏览 0 评论

本文主要介绍Vue SSR(vue服务端渲染)的应用场景,开发中容易遇到的一些问题,提升ssr性能的方法,以及ssr的安全性问题。

SSR的应用场景

1.SEO需求

SEO(Search Engine Optimization,搜索引擎优化),是一种利用搜索引擎规则,提高网站在搜索引擎内自然排名的技术。通常这需要页面内容在页面加载完成时便已经存在。SEO需求的存在与互联网技术的发展历程密不可分。在互联网产生之初,网页使用超文本链接协议,将服务器的信息传递给客户端。而后出现了专门为人们检索信息的搜索引擎。随着前端技术的不断发展,出现了前后端分离的纯前端项目,由于这类项目需要页面加载完成后再异步获取数据渲染,因此大部分搜索引擎无法获取到这类项目的内容。Vue SSR正是基于此类需求而给出的一种技术方案。利用nodejs搭建页面渲染服务,在服务端完成之前需要在客户端完成的页面渲染工作,输出给SEO更友好的页面。

除Vue SSR方案外,也可以选择Prerender(https://github.com/prerender/prerender)作为替代方案。Prerender和Vue SSR的相同点是都需要在服务端完成页面的渲染,不同点在于Prerender采用无界面虚拟浏览器Phantomjs去渲染输出页面,而Vue SSR是基于vue组件的渲染。相比来说Prerender的通用性更强,任何页面都适用,而Vue SSR则只适用于vue项目,但由于Vue SSR是基于代码层面的直接渲染,不需要像Prerender那样再去拉取静态资源,因此速度更快。

至于应该使用哪一种技术方案,就要视需求和实际情况取舍了。

2.首屏渲染速度

如在上面SEO需求中提到的,目前前后端的分离的前端项目需要先加载静态资源,再异步获取数据,最后渲染页面,在这个过程中的前两部页面都是没有数据的,影响了首屏的渲染速度,也就影响了用户的体验。 目前对于首屏渲染速度的提升有许多方案,在ssr之外还有龙骨,墓碑,数据直出。相比于这些方案ssr方案实现是最复杂的,但效果也是最好的。

下图是项目使用服务端渲染前后的首屏加载时间对比,可以明显看出服务端渲染将白屏时间和首屏完成渲染的时间都减少了50%左右。

3.Vue SSR方案的选择

目前Vue SSR的实现有两种实现,一种是基于官方Vue SSR指南文档的官方方案,一种是vue.js通用应用框架--NUXT。 官方方案具有更直接的控制应用程序的结构,更深入底层,更加灵活,同时在使用官方方案的过程中,也会对Vue SSR有更加深入的了解。 而NUXT提供了平滑的开箱即用的体验,它建立在同等的Vue技术栈之上,但抽象出很多模板,并提供了一些额外的功能,例如静态站点生成。通过NUXT可以根据约定的规则,快速的实现Vue SSR。

开发中容易遇到的一些问题

1.一套代码两套执行环境

vue的生命周期钩子函数中, 只有beforeCreate和created会在服务器端渲染(SSR)过程中被调用,这就是说在这两个钩子函数中的代码以及除了vue生命周期钩子函数的全局代码,都将会在服务端和客户端两套环境下执行。如果在两套环境的代码中加入具有副作用的代码或访问特定平台的API,将出现各种问题。比如服务端没有window、document对象, 如果加了对这个对象的引用和操作,将在服务端引起报错中断。

因此,总结起来,最容易犯的错误就是不判断环境就去使用window、document对象。

解决方案:

(1)在beforeCreate,created生命周期以及全局的执行环境中调用特定的api前需要判断执行环境;

(2)使用adapter模式,写一套adapter兼容不同环境的api。

2.服务端数据的预获取

官方方案使用Vuex在服务端预获取数据。 在服务端添加vue钩子函数,获取数据后,将数据保存在vuex的store结构中,同时渲染页面。

在数据预获取阶段注册的钩子函数中,最好只进行数据的获取和保存,不进行其他任何涉及this的操作。因为此时的this是服务端的this,是所有用户共享的this,进行操作将发生一些不可预知的错误。

举个例子,比如想在数据预获取的钩子函数中操作data数据。 首先,数据预获取的钩子函数在运行时还没有vue的实例,因此根本拿不到关于vue实例的任何东西;其次,进行的存取操作都是在所有用户的公共变量下进行的,一旦成功进行了存取操作,必然是所有用户的存取操作。

同时需要注意的是,vuex在Vue SSR方案下,应使用惰性注册的方案。如果不使用惰性注册方案,而是在一开始vuex初始化实例的时候就把所有的模块统一注册,将会出现多个页面共用许多模块的问题。

如我们有store模块如下:

则在路由组件内,需要按如下代码惰性注册vuex模块


总结起来就是,在服务端预获取数据的钩子函数中,不要进行额外的操作,任何对于数据的额外操作都要在vuex的体系下进行,vuex在Vue SSR方案下,应使用惰性注册的方案。

3.接口代理的问题

由于前端平时开发时的接口很多都是线下的,因此需要对于接口的地址进行代理切换。我们平时用的最多的是fiddler和charles等端口代理软件。但是ssr在数据预获取时走的是服务端,不是浏览器,因此不能通过这两个工具进行代理。

办法有两个,一个是修改服务器的host地址,这个方法在开发阶段只需要更改本机的host就好,但是在提测阶段需要修改服务器的host,如果两个项目在同一个机器上测试,将不可避免的造成冲突。 第二个方法是使用axios的代理功能,因为axios对于ssr有天然的适配性,因此99%的项目都会用它。而它自带的proxy功能,可以帮助我们方便的做接口代理。

代理配置文件如下:

代理设置代码如下:

4.cookie穿透

由于客户端的http请求首先达到SSR服务器,再由SSR服务器去后端服务器获取相应的接口数据。在客户端到SSR服务器的请求中,客户端是携带有cookie数据的。但是在SSR服务器请求后端接口的过程中,却是没有相应的cookie数据的。因此在SSR服务器进行接口请求的时候,我们需要手动拿到客户端的cookie传给后端服务器。这里如果使用是axios,就可以手动设置axios请求的headers字段,达到cookie穿透的目的。

5.路由模式

vue有两种路由模式,一种是hash模式,就是我们经常用的#/hasha/hashb这种,还有一种是history模式,就是/historya/historyb这种。因为hash模式的路由提交不到服务器上,因此ssr的路由需要采用history的方式。

异常处理问题

1.异常来自哪里?

(1)服务端数据预获取过程中的异常,如接口请求的各种异常,获取到数据后对数据进行操作的过程中出现的错误异常。

(2)在服务端数据预获取的生命周期结束后的渲染页面过程中出现的异常,包括各种操作数据的语法错误等,如对undefined取属性。

2.怎么处理异常

(1)官方处理方法

抛出500错误页面,体验不友好,产品不接受。

(2)目前采用的方法

a.服务端数据预获取过程中出现的异常,让页面继续渲染,不抛出500异常页面,打错误日志,接入监控。同时,在页面加入标志,让前端页面再次进行一次数据获取页面渲染的尝试。

b.页面渲染过程的异常。由于目前渲染过程是vue提供的一个插件进行的,异常不好捕获,同时出现问题的概率不是很大,因此还没有做专门的处理。

代码如下:

entry-server.js服务端部分:

index.template.html页面模板部分增加如下js代码:

entry-client.js客户端部分:

总结:总结起来一句话,为了更好的体验,不要出现500。

性能

ssr可以提高首屏加载的速度,减少白屏时间,通过以下设置可以提高性能,减少服务器资源的占用,加快访问速度。

(1)页面级别的缓存 将渲染完成的页面缓存到内存中,同时设置最大缓存数量和缓存时间。 优势:大幅度提高页面的访问速度 代价:增加服务器内存的使用

(2)组件级别的缓存 适用:纯静态组件,v-for中循环的子组件

(3)接口级别的缓存

安全

因为做了node服务,因此安全方面也需要考虑。

(1)DDOS攻击

最基本的DDOS攻击就是利用合理的服务请求来占用过多的服务资源,从而使合法用户无法得到服务的响应

应对:

1.提升硬件设备

硬件性能越好,提供的服务并发能力越强,这样即使有小量的DDOS攻击也可以不影响正常用户的访问。

2.在服务端只做最基本的处理

在服务端不做过多复杂的数据处理,可以有效的提高ssr的性能。

3.日志只打印关键部位的关键信息

打印日志过多将耗费服务器资源,影响服务器的性能。

4.DDOS流量清洗

部署流量清洗相关设备,可以对网络中的DDoS攻击流量进行清除,同时保证正常流量的通过。

5.DDOS软硬件防火墙

软件防火墙解决方案为将软件防火墙部署到被保护的服务器上,优点是成本低、方便、灵活,缺点是作用有限、占用资源。

硬件防火墙解决方案为安装防火墙硬件,优点是效果好,缺点是成本高。

(2)sql注入

就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令 例如: 游戏pc详情页的代码为http://game.zhuanzhuan.com/detail/1001306437923405830?metric=e32aeb1b742c27af0ec80cef4b51b654

而攻击者将url替换为http://game.zhuanzhuan.com/detail/select%20*%20from%20user?metric=e32aeb1b742c27af0ec80cef4b51b654

应对:

1.对参数进行校验

在服务端的entry文件中添加校验代码,执行组件的校验规则

(3)数据泄露

使用vuex的情况下,如果不使用惰性加载,容易造成数据泄露的情况发生。

关于任何需要登录获取数据的情况,建议不在服务端进行,只在客户端进行

编辑:千锋HTML5

作者:ChokCoco

原文:www.cnblogs.com/coco1s/p/8882542.html

相关推荐

全栈之路:从零搭建docker+jenkins+node.js自动化部署环境

上两篇全栈之路:前端工程师如何从0开始了解Docker全栈之路:vue-cli3项目从搭建优化到docker部署1、docker部分1.1、docker简介Docker是一个开源的应用容器引...

Vue脚手架(基础+Node.js安装)【vue脚手架教程】

关于VueVue.js(读音:/vju?/,类似于:view)是一套构建用户界面的渐进式框Vue.js的官方网址是:https://cn.vuejs.org/index.html传统的前端开发...

开源Vue后端UI开箱即用解决方案——vuestic-admin

引言这是一个Vue的后端开箱即用UI项目框架,和之前的ReactAdmin类似,它是一个框架,也就意味着它帮你完成了很多公用的部分,你只需要在其基础上进行自己的项目扩展即可。大体上这是由Vue和boo...

用css3实现惊艳面试官的背景即背景动画(高级附源码)

我们传统的前端更多的是用javascript实现各种复杂动画,自从有了Css3transition和animation以来,前端开发在动画这一块有了更高的自由度和格局,对动画的开发也越来越容易。这篇...

基于vue-cli4构建vue项目【vue cli搭建】

前提条件:(1)安装node.js(2)安装yarn(3)安装@vue/cliyarnglobaladd@vue/cli通过命令行模式创建一个项目:vuecreatehello-world注...

74、scss 是什么?在 Vue-cli 中的安装使用步骤是?有哪几大特性?

1、基本定义SCSS即是SASS的新语法,是SassyCSS的简写,是CSS3语法的超集,也就是说所有有效的CSS3样式也同样适合于SASS,SASS是CSS3的一个扩展,...

前端基础学习:Vue2.0实现移动端外卖平台项目,参考旧版饿了么!

主要依赖基于vue@2.0使用vue-cli@2.0搭建项目框架使用vue-router@2.1进行页面路由切换使用vue-resource@1.0.1进行http请求获取数据mock假数据...

手把手教你深刻理解vue实例的生命周期和钩子函数

虽然经常使用mounted、created等几个钩子函数,但是并没有很系统的将它和生命周期关联一起去理解,这导致我在最近项目里踩了坑。所以现在花点时间,整理一下这方面的知识。转载链接:https://...

记一次Vue3.0技术干货分享会【vue3.0入门】

作者:lulu_up转发链接:https://segmentfault.com/a/1190000022719461前言前面小编也整理了关于Vue3.0的设计原则、入门语法、虚拟Dom、Vue3.0...

Vue3 入门教程 两种方式创建Vue项目【创建一个vue3项目】

脚手架创建#全局重新安装最新版本的 @vue/cliyarnglobaladd@vue/cli@next#ORnpminstall-g@vue/cli@next#要...

打造vuecli3+element后台管理系统(三)优化路由和vuex仓库

我们在做后台系统的时候,经常会有比较多的功能页面,每个页面或多或少都会有需要存储在vuex中的数据,一般情况下我们会在state下定义不同的object,但是当功能一多,全部字段和action、mut...

2021年到了,Vue 3准备好了吗?【vue3正式发布了吗】

Vue3.0图/v3.cn.vuejs.org经历了两年多的开发,Vue3.0终于在2020年9月18日发布[1]。2021年年初,我抱着尝鲜的想法用Vue3及其生态编写了一个企业应用的管理后...

vue3学习第一步-创建vue3项目【vue3新建项目】

使用vue-cli创建vue3初始化项目介绍:1.创建一个vue3目录,安装vue-cli,vue-cli的版本4.0以上。cnpminstall@vue/cli(电脑已存在vue2不用cnp...

非常优秀vue开源框架Vuetify最新版本1.5.14【vue开发框架使用实例】

简介VuetifyStar数为19K+,提供了80多个Vue.js组件,这些组件是根据谷歌MaterialDesign指南实现的。开箱即用的项目脚手架,Vuetify已预先制作了8...

基于 vue3.x+vant3.x 搭建示例项目【搭建网站】

今天给大家分享一些如何使用Vue3.0+Vant3搭建demo项目。目前市面上有关vue3的项目并不多,vue3的UI组件库有ant-design-vue和vant-ui。接下来讲解下使用vue3、v...

取消回复欢迎 发表评论: