详解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下onpropertychange事件的绑定方法
Aug 01 Javascript
javascript打印大全(打印页面设置/打印预览代码)
Mar 29 Javascript
JScript分割字符串示例代码
Sep 04 Javascript
浅析JQuery UI Dialog的样式设置问题
Dec 18 Javascript
JavaScript String 对象常用方法详解
May 13 Javascript
jQuery模拟实现的select点击选择效果【附demo源码下载】
Nov 09 Javascript
js操作浏览器的参数方法
Jan 21 Javascript
Bootstrap3 多个模态对话框无法显示的解决方案
Feb 23 Javascript
Bootstrap.css与layDate日期选择样式起冲突的解决办法
Apr 07 Javascript
AngularJS 霸道的过滤器小结
Apr 26 Javascript
JavaScript定义函数的三种实现方法
Sep 23 Javascript
Vue-cli3项目配置Vue.config.js实战记录
Jul 29 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开启openssl的方法
2014/05/15 PHP
php判断一个数组是否为有序的方法
2015/03/27 PHP
php动态变量定义及使用
2015/06/10 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
针对PHP开发安全问题的相关总结
2019/03/22 PHP
用javascript实现读取txt文档的脚本
2007/07/20 Javascript
关于递归运算的顺序测试代码
2011/11/30 Javascript
使用jQuery的attr方法来修改onclick值
2014/07/07 Javascript
javascript的日期对象、数组对象、二维数组使用说明
2014/12/22 Javascript
JavaScript实现强制重定向至HTTPS页面
2015/06/10 Javascript
详解Webwork中Action 调用的方法
2016/02/02 Javascript
jQuery 生成svg矢量二维码
2016/08/09 Javascript
Node.js Mongodb 密码特殊字符 @的解决方法
2017/04/11 Javascript
js中字符型和数值型数字的互相转化方法(必看)
2017/04/25 Javascript
基于Particles.js制作超炫粒子动态背景效果(仿知乎)
2017/09/13 Javascript
通过jquery获取上传文件名称、类型和大小的实现代码
2018/04/19 jQuery
vue项目中添加单元测试的方法
2018/07/21 Javascript
vue-router结合vuex实现用户权限控制功能
2019/11/14 Javascript
[51:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
初步解析Python中的yield函数的用法
2015/04/03 Python
Python操作串口的方法
2015/06/17 Python
Centos Python2 升级到Python3的简单实现
2016/06/21 Python
python之文件的读写和文件目录以及文件夹的操作实现代码
2016/08/28 Python
Python实现批量读取图片并存入mongodb数据库的方法示例
2018/04/02 Python
Python二叉树的镜像转换实现方法示例
2019/03/06 Python
python将字符串转换成json的方法小结
2019/07/09 Python
Python中os模块功能与用法详解
2020/02/26 Python
Css3新特性应用之形状总结
2016/12/08 HTML / CSS
安纳塔拉酒店度假村及水疗官方网站:Anantara Hotel
2016/08/25 全球购物
事假请假条范文
2014/04/11 职场文书
群众路线自查报告及整改措施
2014/11/04 职场文书
欢迎新生标语2015
2015/07/16 职场文书
田径运动会通讯稿
2015/07/18 职场文书
MySQL令人咋舌的隐式转换
2021/04/05 MySQL
oracle delete误删除表数据后如何恢复
2022/06/28 Oracle
ssh服务器拒绝了密码 请再试一次已解决(亲测有效)
2022/08/14 Servers