vue项目改造SSR(服务端渲染)
缺点:1、SEO问题
2、首屏速度问题
3、消耗性能的问题
优点:
1、更好的 SEO,由于搜索引擎爬虫抓取工具可以直接查看完全渲染的页面
2、首屏渲染速度快
SSR 简单来说就是将页面在服务端渲染完成后在客户端直接展示。
indextemplatehtml
serverjs
vue项目是通过虚拟 DOM来挂载到html的,所以对spa项目,爬虫才会只看到初始结构。虚拟 DOM,最终要通过一定的方法将其转换为真实 DOM。虚拟 DOM 也就是 JS 对象,整个服务端的渲染流程就是通过虚拟 DOM 的编译成完整的html来完成的。
需要通过Webpack打包生成两份bundle文件:
Client Bundle,给浏览器用。和纯Vue前端项目Bundle类似
Server Bundle,供服务端SSR使用,一个json文件
不管项目先前是什么样子,是否是使用vue-cli生成的。都会有这个构建改造过程。在构建改造这里会用到 vue-server-renderer 库,这里要注意的是 vue-server-renderer 版本要与Vue版本一样。
打包之后目录结构
vueconfigjs
indextemplatehtml
打包成客户端和服务器端
启动node服务
github地址: https://githubcom/wang12321/SSR
本文主要介绍 UmiJS 的预渲染功能。
服务端渲染(Server-Side Rendering),是指由 服务端 完成页面的 HTML 结构拼接的页面处理技术,发送到浏览器,然后为其绑定状态与事件,成为完全可交互页面的过程。
服务端渲染,首先得有后端服务器(一般是 Nodejs)才可以使用,而没有后端服务器的情况下,可以使用 预渲染 。
预渲染与服务端渲染唯一的不同点在于 渲染时机 ,服务端渲染的时机是在用户访问时执行渲染(即实时渲染,数据一般是最新的),预渲染的时机是在项目构建时,当用户访问时,数据不一定是最新的( 如果数据没有实时性,可以直接考虑预渲染 )。
预渲染在构建时执行渲染,将渲染后的 HTML 片段生成静态 HTML 文件。无需使用 web 服务器实时动态编译 HTML,适用于 静态站点生成 。
Umi3 在 SSR 上做了大量优化及开发体验的提升,具有以下特性:
默认情况下,服务端渲染时关闭的,可通过配置开启:
服务端渲染的数据获取方式与 SPA(单页应用) 有所不同,为了让客户端和服务端都能获取到同一份数据,Umi 提供了页面级数据的预获取。
每个页面可能有单独的数据预获取逻辑,这里我们会获取页面组件上的 getInitialProps 静态方法,执行后将结果注入到该页面组件的 props 中,如:
getInitialProps 有几个固定参数:
为了结合数据流框架,我们提供了 modifyGetInitialPropsCtx 方法,由插件或应用来扩展 ctx 参数,以 dva 为例:
然后在页面中,可以获取到 store :
同时也可以在自身应用中进行扩展:
同时可以使用 getInitialPropsCtx 将服务端参数扩展到 ctx 中,例如:
在使用的时候,就有 req 对象,不过需要注意的是,只在服务端执行时才有此参数:
则在执行 getInitialProps 方法时,除了以上两个固定参数外,还会获取到 title 和 store 参数。
关于 getInitialProps 执行逻辑和时机,需要注意:
执行 umi build ,除了正常的 umijs 外,会多一个服务端文件: umiserverjs (相当于服务端入口文件)。然后在后端框架中,引用该文件:
render 方法参数和返回值如下:
完美兼容客户端动态加载,配置如下:
@umijs/preset-react 插件集中已内置对标题的渲染,通过以下步骤使用:
@umijs/preset-react 插件集中已内置 dva
这时候 getInitialProps(ctx) 中的 ctx 就会有 store 属性,可执行 dispatch ,并返回初始化数据。
Umi 同时支持对服务端和客户端包大小的分析
什么是服务器端渲染和客户端渲染?
互联网早期,用户使用浏览器浏览的都是一些没有复杂逻辑的、简单的页面,这些页面都是在后端将html拼接好的然后将之返回给前端完整的html文件,浏览器拿到这个html文件之后就可以直接解析展示了,而这也就是所谓的服务器端渲染了。而随着前端页面的复杂性提高,前端就不仅仅是普通的页面展示了,而可能添加了更多功能性的组件,复杂性更大,另外,彼时ajax的兴起,使得业界就开始推崇前后端分离的开发模式,即后端不提供完整的html页面,而是提供一些api使得前端可以获取到json数据,然后前端拿到json数据之后再在前端进行html页面的拼接,然后展示在浏览器上,这就是所谓的客户端渲染了,这样形成了前后端分离,前端就可以专注UI的开发,后端专注于逻辑的开发。
两者本质的区别是什么?
客户端渲染和服务器端渲染的最重要的区别就是究竟是谁来完成html文件的完整拼接,如果是在服务器端完成的,然后返回给客户端,就是服务器端渲染,而如果是前端做了更多的工作完成了html的拼接,则就是客户端渲染。
在这里插入描述
服务器端渲染的优缺点是怎样的?
优点:
前端耗时少。因为后端拼接完了html,浏览器只需要直接渲染出来。
有利于SEO。因为在后端有完整的html页面,所以爬虫更容易爬取获得信息,更有利于seo。
无需占用客户端资源。即解析模板的工作完全交由后端来做,客户端只要解析标准的html页面即可,这样对于客户端的资源占用更少,尤其是移动端,也可以更省电。
后端生成静态化文件。即生成缓存片段,这样就可以减少数据库查询浪费的时间了,且对于数据变化不大的页面非常高效 。
缺点:
不利于前后端分离,开发效率低。使用服务器端渲染,则无法进行分工合作,则对于前端复杂度高的项目,不利于项目高效开发。另外,如果是服务器端渲染,则前端一般就是写一个静态html文件,然后后端再修改为模板,这样是非常低效的,并且还常常需要前后端共同完成修改的动作; 或者是前端直接完成html模板,然后交由后端。另外,如果后端改了模板,前端还需要根据改动的模板再调节css,这样使得前后端联调的时间增加。
占用服务器端资源。即服务器端完成html模板的解析,如果请求较多,会对服务器造成一定的访问压力。而如果使用前端渲染,就是把这些解析的压力分摊了前端,而这里确实完全交给了一个服务器。
客户端渲染的优缺点是怎样的?
优点:
前后端分离。前端专注于前端UI,后端专注于api开发,且前端有更多的选择性,而不需要遵循后端特定的模板。
体验更好。比如,我们将网站做成SPA或者部分内容做成SPA,这样,尤其是移动端,可以使体验更接近于原生app。
缺点:
前端响应较慢。如果是客户端渲染,前端还要进行拼接字符串的过程,需要耗费额外的时间,不如服务器端渲染速度快。
不利于SEO。目前比如百度、谷歌的爬虫对于SPA都是不认的,只是记录了一个页面,所以SEO很差。因为服务器端可能没有保存完整的html,而是前端通过js进行dom的拼接,那么爬虫无法爬取信息。 除非搜索引擎的seo可以增加对于JavaScript的爬取能力,这才能保证seo。
使用服务器端渲染还是客户端渲染?
不谈业务场景而盲目选择使用何种渲染方式都是耍流氓。比如企业级网站,主要功能是展示而没有复杂的交互,并且需要良好的SEO,则这时我们就需要使用服务器端渲染;而类似后台管理页面,交互性比较强,不需要seo的考虑,那么就可以使用客户端渲染。
另外,具体使用何种渲染方法并不是绝对的,比如现在一些网站采用了首屏服务器端渲染,即对于用户最开始打开的那个页面采用的是服务器端渲染,这样就保证了渲染速度,而其他的页面采用客户端渲染,这样就完成了前后端分离。
对于前后端分离,如果进行seo优化?
如果进行了前后端分离,那么前端就是通过js来修改dom使得html拼接完全,然后再显示,或者是使用SPA,这样,seo几乎没有。那么这种情况下如何做seo优化呢?
我们可以自行提交sitemap,让蜘蛛主动去爬取,但是遇到了sitemap中的url,达到指定页面之后只有元js怎么办呢?这是我们可以使用标签来进行简单的优化,比如打印出当前页面信息的一些关键的信息点,但是正常用户并不需要这些,会造成额外的负担,且前端可以判断是否支持JavaScript,而后段不行,只好根据百度的spider做UA判断,使用phantomjs或者nginx代理,来对spider访问的页面进行特殊的处理,达到被收录的效果。但这种效果还是不好。。。
而目前的react和vue都提供了SSR,即服务器端渲染,这也就是提供seo不好的解决方式了。
究竟如何理解前后端分离?
实际上,时至今日,前后端分离一定是必然或者趋势,因为早期在web10时代的网页就是简单的网页,而如今的网页越来越朝向app前进,而前后端分离就是实现app的必然的结果。所以,我们可以认为html、css、JavaScript组成了这个app,然后浏览器作为虚拟机来运行这些程序,即浏览器成为了app的运行环境,成了客户端,总的来说就是当前的前端越来越朝向桌面应用或者说是手机上的app发展了,而比如说电脑上的qq可以服务器端渲染吗?肯定不能!所以前后端分离也就成了必然。而我们目前接触额前端工程化、编译(转译)、各种MVC/MVVM框架、依赖工具、npm、bable、webpack等等看似很新鲜、创新的东西实际上都是传动桌面开发所形成的概念,只是近年来前端发展较快而借鉴过来的,本质上就是开源社区东平西凑做出来的一个visual studio。
浏览器
1、找到电脑任务栏右小角的小飞机图标。
2、右键点击小飞机图标,依次找到服务器订阅--SSR服务器订阅设置。
3、打开订阅设置窗口,先点击Add再把订阅地址粘贴到网址的输入框里,其他都不用填,然后点击确定;如果是更给订阅的话,只要用新的订阅地址覆盖掉旧的订阅地址。
4、右键点击小飞机图标,依次找到服务器订阅--更新SSR服务器订阅(不通过代理)。这里由于SSR版本不同,不是492版本的可能有的找不到更新SSR服务器订阅(不通过代理),那就选择更新SSR服务器订阅(此时代理还没有设置成功,所以不能通过代理来更新订阅)。
5、右键点击小飞机图标,找到服务器,如果订阅成功,会出现92***top-单端口。
6、选择剩余流量和过期时间以外的节点,至此SSR订阅应该已经成功。
7、右键点击小飞机图标,找到系统代理模式,确认选择的是PAC模式或者全局模式,而不是直连模式,然后在浏览器里地址栏里输入网址,测试一下是否可以访问。如果访问成功,说明设置成功;如果访问不成功,将系统代理模式切换一下(原来是PAC模式切换成全局模式,原来是全局模式切换成PAC模式),再刷新网页。
0条评论