详解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 相关文章推荐
增强的 JavaScript 的 trim 函数的代码
Aug 13 Javascript
javascript 变量作用域 代码分析
Jun 26 Javascript
javascript整除实现代码
Nov 23 Javascript
JS去除右边逗号的简单方法
Jul 03 Javascript
一个支付页面DEMO附截图
Jul 22 Javascript
node中socket.io的事件使用详解
Dec 15 Javascript
node.js中的fs.appendFile方法使用说明
Dec 17 Javascript
解决wx.onMenuShareTimeline出现的问题
Aug 16 Javascript
微信小程序实现蒙版弹窗效果
Nov 01 Javascript
bootstrap中的导航条实例代码详解
May 20 Javascript
JavaScript中BOM对象原理与用法分析
Jul 09 Javascript
js+canvas实现简单扫雷小游戏
Jan 22 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
windows下升级PHP到5.3.3的过程及注意事项
2010/10/12 PHP
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
PHP检测链接是否存在的代码实例分享
2016/05/06 PHP
php实现微信公众号创建自定义菜单功能的实例代码
2019/06/11 PHP
JavaScript 闭包深入理解(closure)
2009/05/27 Javascript
基于jquery的气泡提示效果
2010/05/31 Javascript
JS随即打乱数组实现代码
2012/12/03 Javascript
JQuery文字列表向上滚动的代码
2013/11/13 Javascript
用于deeplink的js方法(判断手机是否安装app)
2014/04/02 Javascript
JavaScript中的原型和继承详解(图文)
2014/07/18 Javascript
解决angular的$http.post()提交数据时后台接收不到参数值问题的方法
2015/12/10 Javascript
JavaScript实战之带收放动画效果的导航菜单
2016/08/16 Javascript
Vue获取DOM元素样式和样式更改示例
2017/03/07 Javascript
vue-router实现webApp切换页面动画效果代码
2017/05/25 Javascript
nodejs后台集成ueditor富文本编辑器的实例
2017/07/11 NodeJs
Angular4.x Event (DOM事件和自定义事件详解)
2018/10/09 Javascript
JS复杂判断的更优雅写法代码详解
2018/11/07 Javascript
详解关于element el-button使用$attrs的一个注意要点
2018/11/09 Javascript
微信小程序实现左右列表联动
2020/05/19 Javascript
vue表单数据交互提交演示教程
2019/11/13 Javascript
Vue+element-ui添加自定义右键菜单的方法示例
2020/12/08 Vue.js
在Python中使用SimpleParse模块进行解析的教程
2015/04/11 Python
Python 探针的实现原理
2016/04/23 Python
Python 装饰器使用详解
2017/07/29 Python
Python 读取图片文件为矩阵和保存矩阵为图片的方法
2018/04/27 Python
解决pyinstaller打包exe文件出现命令窗口一闪而过的问题
2018/10/31 Python
Python3实现获取图片文字里中文的方法分析
2018/12/13 Python
基于wxPython的GUI实现输入对话框(1)
2019/02/27 Python
Python unittest discover批量执行代码实例
2020/09/08 Python
CSS3制作圆形滚动进度条动画的示例
2020/11/05 HTML / CSS
化学学院毕业生自荐信范文
2013/12/17 职场文书
仓管岗位职责范本
2014/02/08 职场文书
教师演讲稿开场白
2014/08/25 职场文书
四年级数学教学反思
2016/02/16 职场文书
Oracle更换为MySQL遇到的问题及解决
2021/05/21 Oracle
redis使用不当导致应用卡死bug的过程解析
2021/07/01 Redis