详解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引用指针使用介绍
Nov 07 Javascript
简单的Jquery全选功能
Nov 07 Javascript
JQuery给select添加/删除节点的实现代码
Apr 26 Javascript
ztree简介_动力节点Java学院整理
Jul 19 Javascript
vue 利用路由守卫判断是否登录的方法
Sep 29 Javascript
微信小程序实现购物页面左右联动
Feb 15 Javascript
七行JSON代码把你的网站变成移动应用过程详解
Jul 09 Javascript
详解使用JWT实现单点登录(完全跨域方案)
Aug 02 Javascript
VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法
Apr 17 Javascript
js通过canvas生成图片缩略图
Oct 02 Javascript
vue 如何使用递归组件
Oct 23 Javascript
webpack介绍使用配置教程详解webpack介绍和使用
Jun 25 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使用者状态管理功能的应用
2006/10/09 PHP
利用浏览器的Javascript控制台调试PHP程序
2014/01/08 PHP
ThinkPHP文件上传实例教程
2014/08/22 PHP
php利用反射实现插件机制的方法
2015/03/14 PHP
php微信开发接入
2016/08/27 PHP
Smarty日期时间操作方法示例
2016/11/15 PHP
Yii实现复选框批量操作实例代码
2017/03/15 PHP
Javascript实例教程(19) 使用HoTMetal(2)
2006/12/23 Javascript
JSON 编辑器实现代码
2009/12/06 Javascript
JS Pro-深入面向对象的程序设计之继承的详解
2013/05/07 Javascript
JavaScript程序员应该知道的45个实用技巧
2014/03/04 Javascript
JS封装cookie操作函数实例(设置、读取、删除)
2015/11/17 Javascript
JavaScript使用DeviceOne开发实战(三)仿微信应用
2015/12/02 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
2016/02/23 Javascript
jQuery soColorPacker 网页拾色器
2016/06/22 Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
2016/08/03 Javascript
浅谈JavaScript 覆盖原型以及更改原型
2016/08/31 Javascript
SpringMVC简单整合Angular2的示例
2017/07/31 Javascript
vue项目base64字符串转图片的实现代码
2018/07/13 Javascript
ES6小技巧之代替lodash
2019/06/07 Javascript
vue集成kindeditor富文本的实现示例代码
2019/06/07 Javascript
ES6 Class中实现私有属性的一些方法总结
2019/07/08 Javascript
用Python分析3天破10亿的《我不是药神》到底神在哪?
2018/07/12 Python
对python多线程与global变量详解
2018/11/09 Python
python中的协程深入理解
2019/06/10 Python
Python求解正态分布置信区间教程
2019/11/20 Python
TensorFlow实现从txt文件读取数据
2020/02/05 Python
Python requests上传文件实现步骤
2020/09/15 Python
如何使用python自带IDLE的几种方法
2020/10/10 Python
ASP.NET Core中的配置详解
2021/02/05 Python
宝信软件JAVA工程师面试经历
2012/08/19 面试题
部门群众路线教育实践活动对照检查材料思想汇报
2014/10/07 职场文书
敬业奉献模范事迹材料
2014/12/24 职场文书
获奖感言范文
2015/07/31 职场文书
小学生安全教育心得体会
2016/01/15 职场文书
2019个人工作态度自我评价
2019/04/24 职场文书