详解vue服务端渲染(SSR)初探


Posted in Javascript onJune 19, 2017

前言

首先来讲一下服务端渲染,直白的说就是在服务端拿数据进行解析渲染,直接生成html片段返回给前端。具体用法也有很多种比如:

传统的服务端模板引擎渲染整个页面

服务渲染生成htmll代码块, 前端 AJAX 获取然后js动态添加

服务端渲染的优劣

首先是seo问题,前端动态渲染的内容是不能被抓取到的,而使用服务端渲染就可以解决这个问题。还有就是首屏加载过慢这种问题,比如在SPA中,打开首页需要初始加载很多资源,这时考虑在首屏使用服务端渲染,也是一种折中的优化方案。但是使用SSR时,势必会增加服务器的压力,还有可能会需要前后端同构,使用同样的模板引擎,这似乎与前后端分离的观点又是矛盾的。废话就说到这里,下面来看一下vue框架中的服务器渲染。

vue-server-renderer

vue-server-renderer就是vue中处理服务端加载的一个模块了,官方文档:https://ssr.vuejs.org/en/,暂时没有中文版的,我也只是稍微看了一些,然后写了一个简单的demo。首先新建一个test.js文件,并用npm安装依赖express、vue、vue-server-renderer。引入vue-server-renderer之后,然后新建一个temp.html作为渲染的基本模板,用createRenderer方法新建一个render实例,这里我传入temp.html作为renderer的template的参数,在后面渲染时就会以这个temp.html作为基础模板。

const renderer = require('vue-server-renderer').createRenderer({
  template: require('fs').readFileSync('./temp.html', 'utf-8')
})

temp.html:

<!DOCTYPE html>
<html lang="en">
<head><title>{{title}}</title></head>
 <body>
  <!--vue-ssr-outlet-->
 </body>
</html>

接下来随便定义一些渲染用的数据,然后用express新建一个node服务器,再定义一个vue的实例。然后再调用renderer的renderToString方法来渲染生成html,渲染成功后返回给客户端。

const Vue = require('vue')
const server = require('express')()
const context = {
 title: 'hello'
}
const mocktitle = '我爱吃的水果'
const mockdata = ['香蕉', '苹果', '橘子']
server.get('*', (req, res) => {
 const app = new Vue({
  data: {
   url: req.url,
   data: mockdata,
   title: mocktitle
  },
  template: <div>The visited URL is: {{ url }}
  <h3>{{title}}</h3>
  <p v-for='item in data'>{{item}}</p>
  </div>
 })
 renderer.renderToString(app, context, (err, html) => {
  if (err) {
   res.status(500).end('Internal Server Error')
   return
  }
  res.end(html)
 })
})
server.listen(8080)

注意这里渲染的数据有两种,mockdata是作为vue实例的data来渲染在实例模板中的,而context是作为基础模板的data来渲染temp.html的。可以看到在服务端用vue进行渲染的规则和前端渲染时一样,v-for、v-if等都可以正常使用。最后命令行输入node test.js,然后在浏览器打开http://localhost:8080 查看结果如下:

详解vue服务端渲染(SSR)初探

可以看到服务端直接返回了一个渲染完成的Doc,示例demo到此结束。

结语

服务端渲染还是客户端渲染的问题,个人觉得还是要针对具体业务场景然后再做选择。然后作为前端我对服务端的东西了解的也不是很多,上面说的如果有不对的地方,欢迎指正拍砖。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js获取GridView中行数据的两种方法 分享
Jul 13 Javascript
jQuery 设置 CSS 属性示例介绍
Jan 16 Javascript
一个小例子解释如何来阻止Jquery事件冒泡
Jul 17 Javascript
jquery实现仿新浪微博带动画效果弹出层代码(可关闭、可拖动)
Oct 12 Javascript
jQuery基于cookie实现的购物车实例分析
Dec 24 Javascript
7个jQuery最佳实践
Jan 12 Javascript
分享网页检测摇一摇实例代码
Jan 14 Javascript
Bootstrap前端开发案例二
Jun 17 Javascript
深入理解Node.js 事件循环和回调函数
Nov 02 Javascript
jQuery源码分析之sizzle选择器详解
Feb 13 Javascript
Vue.js中的computed工作原理
Mar 22 Javascript
vue中element 上传功能的实现思路
Jul 06 Javascript
jQuery实现简单的手风琴效果
Apr 17 #jQuery
原生JS+Canvas实现五子棋游戏实例
Jun 19 #Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
Jun 19 #Javascript
Node.js中 __dirname 的使用介绍
Jun 19 #Javascript
JavaScript 上传文件(psd,压缩包等),图片,视频的实现方法
Jun 19 #Javascript
AngularJS实现自定义指令与控制器数据交互的方法示例
Jun 19 #Javascript
jQuery自定义多选下拉框效果
Jun 19 #jQuery
You might like
相对路径转化成绝对路径
2007/04/10 PHP
PHP改进计算字符串相似度的函数similar_text()、levenshtein()
2014/10/27 PHP
tp5.1 框架数据库-数据集操作实例分析
2020/05/26 PHP
Jquery插件之打造自定义的select标签
2011/11/30 Javascript
html+javascript实现可拖动可提交的弹出层对话框效果
2013/08/05 Javascript
jQuery focus和blur事件的应用详解
2014/01/26 Javascript
js登录弹出层特效
2014/03/07 Javascript
Node.js文件操作详解
2014/08/16 Javascript
JavaScript中exec函数用法实例分析
2015/06/08 Javascript
jquery实现简单合拢与展开网页面板的方法
2015/09/01 Javascript
JS实现带有3D立体感的银灰色竖排折叠菜单代码
2015/10/20 Javascript
AngularJS中实现显示或隐藏动画效果的方式总结
2015/12/31 Javascript
深入浅析AngularJS中的module(模块)
2016/01/04 Javascript
基于javascript实现图片滑动效果
2016/05/07 Javascript
PassWord输入框代码分享
2016/06/07 Javascript
vue.js实现仿原生ios时间选择组件实例代码
2016/12/21 Javascript
AngularJS的Filter的示例详解
2017/03/07 Javascript
小程序扫描普通链接二维码跳转小程序指定界面方法
2019/05/07 Javascript
深入学习JavaScript中的bom
2019/05/27 Javascript
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
element-ui 文件上传修改文件名的方法示例
2019/11/05 Javascript
js实现跳一跳小游戏
2020/07/31 Javascript
[02:17]DOTA2亚洲邀请赛 RAVE战队出场宣传片
2015/02/07 DOTA
简单介绍Python中的JSON使用
2015/04/28 Python
Python爬虫实现百度图片自动下载
2018/02/04 Python
python 文本单词提取和词频统计的实例
2018/12/22 Python
Python深拷贝与浅拷贝用法实例分析
2019/05/05 Python
在python中实现同行输入/接收多个数据的示例
2019/07/20 Python
python输出结果刷新及进度条的实现操作
2020/07/13 Python
Lulu Guinness露露·吉尼斯官网:红唇包
2019/02/03 全球购物
如何用Python输出一个Fibonacci数列
2016/08/28 面试题
财务会计专业求职信范文
2013/12/31 职场文书
项目投资意向书
2014/04/01 职场文书
目标责任书格式
2014/07/28 职场文书
2014离婚协议书范文
2014/09/10 职场文书
以MySQL5.7为例了解一下执行计划
2022/04/13 MySQL