详解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 相关文章推荐
让innerHTML的脚本也可以运行起来
Jul 01 Javascript
利用javascript查看html源文件
Nov 08 Javascript
如何用ajax来创建一个XMLHttpRequest对象
Dec 10 Javascript
js禁止回车提交表单的示例代码
Dec 23 Javascript
Javascript中setTimeOut和setInterval的定时器用法
Jun 12 Javascript
浅谈javascript原型链与继承
Jul 13 Javascript
javascript瀑布流式图片懒加载实例
Jun 28 Javascript
通用无限极下拉菜单的实现代码
May 31 Javascript
vue中的自定义分页插件组件的示例
Aug 18 Javascript
微信小程序登录session的使用
Mar 17 Javascript
微信小程序实现拍照画布指定区域生成图片
Jul 18 Javascript
基于vue 动态菜单 刷新空白问题的解决
Aug 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
php面向对象中的魔术方法中文说明
2014/03/04 PHP
PHP数据库连接mysql与mysqli对比分析
2016/01/04 PHP
php实现的XML操作(读取)封装类完整实例
2017/02/23 PHP
PHP+Ajax实现的无刷新分页功能详解【附demo源码下载】
2017/07/03 PHP
javascript 嵌套的函数(作用域链)
2010/03/15 Javascript
编写可维护面向对象的JavaScript代码[翻译]
2011/02/12 Javascript
js实现仿QQ秀换装效果的方法
2015/03/04 Javascript
jQuery网页版打砖块小游戏源码分享
2015/08/20 Javascript
浅谈JavaScript 中有关时间对象的方法
2016/08/15 Javascript
Angularjs中使用轮播图指令swiper
2017/05/30 Javascript
JSON创建键值对(key是中文或者数字)方式详解
2017/08/24 Javascript
微信小程序倒计时功能实现代码
2017/11/09 Javascript
jQuery实现鼠标滑过商品小图片上显示对应大图片功能【测试可用】
2018/04/27 jQuery
Vue动态组件与异步组件实例详解
2019/02/23 Javascript
Vue 组件注册全解析
2020/12/17 Vue.js
[01:07:57]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第二场 1月19日
2021/03/11 DOTA
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
2016/04/23 Python
Python实现约瑟夫环问题的方法
2016/05/03 Python
50行Python代码实现人脸检测功能
2018/01/23 Python
python如何使用unittest测试接口
2018/04/04 Python
Python基于pandas实现json格式转换成dataframe的方法
2018/06/22 Python
Python3.5装饰器典型案例分析
2019/04/30 Python
Django中celery执行任务结果的保存方法
2019/07/12 Python
Tensorflow限制CPU个数实例
2020/02/06 Python
Python字符串查找基本操作代码案例
2020/10/27 Python
python爬取天气数据的实例详解
2020/11/20 Python
深入CSS3 动画效果的总结详解
2013/05/09 HTML / CSS
css3一个简易的 LED 数字时钟实现方法
2020/01/15 HTML / CSS
html5中canvas学习笔记2-判断浏览器是否支持canvas
2013/01/06 HTML / CSS
PHP经典面试题
2016/09/03 面试题
产品质量承诺书
2014/03/27 职场文书
建设工地安全标语
2014/06/07 职场文书
重阳节活动主持词
2015/07/04 职场文书
2016年妇联“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
python实现MD5进行文件去重的示例代码
2021/07/09 Python
MySQL 自动填充 create_time 和 update_time
2022/05/20 MySQL