详解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 相关文章推荐
iframe 上下滚动条如何默认在下方实现原理
Dec 10 Javascript
Function.prototype.call.apply结合用法分析示例
Jul 03 Javascript
js获取form的方法
May 06 Javascript
js 动态给元素添加、移除事件的实现方法
Jul 19 Javascript
js获取上传文件的绝对路径实现方法
Aug 02 Javascript
JavaScript实现定时页面跳转功能示例
Feb 14 Javascript
vue Element-ui input 远程搜索与修改建议显示模版的示例代码
Oct 19 Javascript
Vue的移动端多图上传插件vue-easy-uploader的示例代码
Nov 27 Javascript
详解微信小程序与内嵌网页交互实现支付功能
Oct 22 Javascript
vue中axios的二次封装实例讲解
Oct 14 Javascript
jQuery 移除事件的方法
Jun 20 jQuery
关于element-ui表单中限制输入纯数字的解决方式
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
详解PHP中array_rand函数的使用方法
2016/09/11 PHP
PhpSpreadsheet设置单元格常用操作汇总
2020/11/13 PHP
Nginx+php配置文件及原理解析
2020/12/09 PHP
基于jquery的不规则矩形的排列实现代码
2012/04/16 Javascript
使用GruntJS构建Web程序之安装篇
2014/06/04 Javascript
浅析jQuery中调用ajax方法时在不同浏览器中遇到的问题
2014/06/11 Javascript
jQuery插件ajaxfileupload.js实现上传文件
2020/10/23 Javascript
JS添加或修改控件的样式(Class)实现方法
2016/10/15 Javascript
详解JavaScript的闭包、IIFE、apply、函数与对象
2016/12/21 Javascript
BootStrap Fileinput初始化时的一些参数
2016/12/30 Javascript
BootStrap Select清除选中的状态恢复默认状态
2017/06/20 Javascript
小程序扫描普通链接二维码跳转小程序指定界面方法
2019/05/07 Javascript
create-react-app中添加less支持的实现
2019/11/15 Javascript
vue setInterval 定时器失效的解决方式
2020/07/30 Javascript
Python中for循环详解
2014/01/17 Python
python获得文件创建时间和修改时间的方法
2015/06/30 Python
Python实现句子翻译功能
2017/11/14 Python
Python实现一个Git日志统计分析的小工具
2017/12/14 Python
python pycurl验证basic和digest认证的方法
2018/05/02 Python
PyCharm设置SSH远程调试的方法
2018/07/17 Python
python安装pil库方法及代码
2019/06/25 Python
python3 打印输出字典中特定的某个key的方法示例
2019/07/06 Python
快速查找Python安装路径方法
2020/02/06 Python
python3中datetime库,time库以及pandas中的时间函数区别与详解
2020/04/16 Python
python中os包的用法
2020/06/01 Python
Python如何使用ConfigParser读取配置文件
2020/11/12 Python
python爬取招聘要求等信息实例
2020/11/20 Python
Foot Locker英国官网:美国知名运动产品零售商
2019/02/21 全球购物
法国一家多品牌成衣精品中/高档商店:Graduate Store
2019/08/28 全球购物
计算机应用与科学个人的自我评价
2013/11/15 职场文书
关心下一代工作先进事迹
2014/08/15 职场文书
商场父亲节活动方案
2014/08/27 职场文书
2015年团支部年度工作总结
2015/05/27 职场文书
python爬虫之爬取笔趣阁小说
2021/04/22 Python
Python可变与不可变数据和深拷贝与浅拷贝
2022/04/06 Python
DQL数据查询语句使用示例
2022/12/24 MySQL