详解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 相关文章推荐
jQuery阻止事件冒泡具体实现
Oct 11 Javascript
浅析return false的正确使用
Nov 04 Javascript
深入浅出理解javaScript原型链
May 09 Javascript
Javascrip实现文字跳动特效
Nov 27 Javascript
JavaScript简单验证表单空值及邮箱格式的方法
Jan 20 Javascript
BootStrap select2 动态改变值的方法
Feb 10 Javascript
Angular中使用$watch监听object属性值的变化(详解)
Apr 24 Javascript
基于vue.js快速搭建图书管理平台
Oct 29 Javascript
使用puppeteer破解极验的滑动验证码
Feb 24 Javascript
vue3.0中的双向数据绑定方法及优缺点
Aug 01 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
Nov 07 Javascript
vue cli3适配所有端方案的实现
Apr 13 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
PHP用反撇号执行外部命令
2015/04/14 PHP
thinkPHP内置字符串截取函数用法详解
2016/11/15 PHP
Jquery Ajax学习实例4 向WebService发出请求,返回实体对象的异步调用
2010/03/16 Javascript
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
纯js网页画板(Graphics)类简介及实现代码
2012/12/24 Javascript
JavaScript 语言基础知识点总结(思维导图)
2013/11/10 Javascript
jQuery中对未来的元素绑定事件用bind、live or on
2014/04/17 Javascript
在Ubuntu上安装最新版本的Node.js
2014/07/14 Javascript
jQuery中queue()方法用法实例
2014/12/29 Javascript
JavaScript实现删除,移动和复制文件的方法
2015/08/05 Javascript
js实现的动画导航菜单效果代码
2015/09/10 Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
2016/08/03 Javascript
jQuery子元素过滤选择器用法示例
2016/09/09 Javascript
浅析BootStrap Treeview的简单使用
2016/10/12 Javascript
jQuery.cookie.js实现记录最近浏览过的商品功能示例
2017/01/23 Javascript
touch.js 拖动、缩放、旋转 (鼠标手势)功能代码
2017/02/04 Javascript
vue-cli3.0 脚手架搭建项目的过程详解
2018/10/19 Javascript
使用js实现一个简单的滚动条过程解析
2019/09/10 Javascript
vue 出现data-v-xxx的原因及解决
2020/08/04 Javascript
vue将文件/图片批量打包下载zip的教程
2020/10/21 Javascript
vue3自定义dialog、modal组件的方法
2021/01/04 Vue.js
[15:46]教你分分钟做大人——沙王
2015/03/11 DOTA
pycharm 使用心得(二)设置字体大小
2014/06/05 Python
python实现telnet客户端的方法
2015/04/15 Python
python数据清洗系列之字符串处理详解
2017/02/12 Python
pyQt5实时刷新界面的示例
2019/06/25 Python
python实现的读取网页并分词功能示例
2019/10/29 Python
Python绘图实现台风路径可视化代码实例
2020/10/23 Python
荷兰超市:DEEN
2018/03/14 全球购物
自荐书范文范例
2014/02/13 职场文书
售后服务承诺书范文
2014/03/26 职场文书
2014年大学生预备党员思想汇报1000字
2014/09/13 职场文书
机动车登记业务委托书
2014/10/08 职场文书
班级班风口号大全
2015/12/25 职场文书
五年级语文教学反思
2016/03/03 职场文书
微信小程序实现聊天室功能
2021/06/14 Javascript