详解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-Jquery简介 入门了解篇
Nov 25 Javascript
利用js的Node遍历找到repeater的一个字段实例介绍
Apr 25 Javascript
JS中typeof与instanceof之间的区别总结
Nov 14 Javascript
JS阻止冒泡事件以及默认事件发生的简单方法
Jan 17 Javascript
jQuery插件jPaginate实现无刷新分页
May 04 Javascript
JS判断页面是否出现滚动条的方法
Jul 17 Javascript
用jQuery旋转插件jqueryrotate制作转盘抽奖
Feb 10 Javascript
JavaScript无阻塞加载和defer、async详解
Feb 26 Javascript
React.js中常用的ES6写法总结(推荐)
May 09 Javascript
Vue 页面状态保持页面间数据传输的一种方法(推荐)
Nov 01 Javascript
JS面向对象编程实现的Tab选项卡案例详解
Mar 03 Javascript
JS删除对象中某一属性案例详解
Sep 08 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
简单实用的.net DataTable导出Execl
2013/10/28 PHP
PHP借助phpmailer发送邮件
2015/05/11 PHP
PHP多进程通信-消息队列使用
2019/03/08 PHP
PHP创建XML接口示例
2019/07/04 PHP
表单项的name命名为submit、reset引起的问题
2007/12/22 Javascript
jQuery-Easyui 1.2 实现多层菜单效果的代码
2012/01/13 Javascript
alert和confirm功能介绍
2014/05/21 Javascript
JavaScript隐式类型转换
2016/03/15 Javascript
Bootstrap媒体对象的实现
2016/05/01 Javascript
原生js实现弹出层登录拖拽功能
2016/12/05 Javascript
基于打包工具Webpack进行项目开发实例
2018/05/29 Javascript
js中this的指向问题归纳总结
2018/11/28 Javascript
微信小程序实现多行文字滚动
2020/11/18 Javascript
[54:09]RNG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
Python实现提取文章摘要的方法
2015/04/21 Python
python中将函数赋值给变量时需要注意的一些问题
2017/08/18 Python
利用Django内置的认证视图实现用户密码重置功能详解
2017/11/24 Python
Python设计模式之工厂模式简单示例
2018/01/09 Python
取numpy数组的某几行某几列方法
2018/04/03 Python
python3+PyQt5实现文档打印功能
2018/04/24 Python
python 实现将字典dict、列表list中的中文正常显示方法
2018/07/06 Python
python3爬虫怎样构建请求header
2018/12/23 Python
Pandas之MultiIndex对象的示例详解
2019/06/25 Python
python中break、continue 、exit() 、pass终止循环的区别详解
2019/07/08 Python
django使用django-apscheduler 实现定时任务的例子
2019/07/20 Python
Djang的model创建的字段和参数详解
2019/07/27 Python
python创建学生成绩管理系统
2019/11/22 Python
Pycharm自动添加文件头注释和函数注释参数的方法
2020/10/23 Python
美国波道夫·古德曼百货官网:Bergdorf Goodman
2017/11/07 全球购物
青年志愿者事迹材料
2014/02/07 职场文书
“学雷锋活动月”总结
2014/03/09 职场文书
班风学风建设方案
2014/05/06 职场文书
湖南省党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
张思德观后感
2015/06/09 职场文书
儿子满月酒致辞
2015/07/29 职场文书
那些美到让人窒息的诗句,值得你收藏!
2019/08/20 职场文书