vue服务端渲染缓存应用详解


Posted in Javascript onSeptember 12, 2018

服务端渲染简介

服务端渲染不是一个新的技术;在 Web 最初的时候,页面就是通过服务端渲染来返回的,用 PHP 来说,通常是使用 Smarty 等模板写模板文件,然后 PHP 服务端框架将数据和模板渲染为页面返回,这样的服务端渲染有个缺点就是一旦要查看新的页面,就需要请求服务端,刷新页面。

但如今的前端,为了追求一些体验上的优化,通常整个渲染在浏览器端使用 JS 来完成,配合 history.pushState 等方式来做单页应用(SPA: Single-Page Application),也收到不错的效果,但是这样还是有一些缺点:第一次加载过慢,用户需要等待较长时间来等待浏览器端渲染完成;对搜索引擎爬虫等不友好。这时候就出现了类似于 React,Vue 2.0 等前端框架来做服务端渲染。

本文重点给大家介绍vue服务端渲染缓存应用,先看下vue缓存分为哪几种吧。

vue缓存分为页面缓存、组建缓存、接口缓存,这里我主要说到了页面缓存和组建缓存

页面缓存:

在server.js中设置

const LRU = require('lru-cache')
const microCache = LRU({
 max: 100, // 最大缓存的数目
 maxAge: 1000 // 重要提示:条目在 1 秒后过期。
})
const isCacheable = req => {
 //判断是否需要页面缓存
if (req.url && req.url === '/') {
 
 return req.url

} else {
 
return false

}
}
app.get('*', (req, res) => {
const cacheable = isCacheable(req)

if (cacheable) {


const hit = microCache.get(req.url)
 

if (hit) {
  
return res.end(hit)

}
 }
const errorHandler = err => {
 if (err && err.code === 404) {
  // 未找到页面
  res.status(404).sendfile('public/404.html');
 } else {
  // 页面渲染错误
  res.status(500).end('500 - Internal Server Error')
  console.error(`error during render : ${req.url}`)
  console.error(err)
 }
}
const context = {
 title: 'vue',
 keywords: 'vue-ssr服务端脚手架',
 description: 'vue-ssr-template, vue-server-renderer',
 version: v,
 url: req.url,
 cookies: req.cookies
}
renderer.renderToString(context, (err, html) => {
 if (err) {
  return errorHandler(err)
 }
 res.end(html)
 microCache.set(req.url, html) // 设置当前缓存页面的内容
})
})

 组建缓存:

在server.js中设置如下:

function createRenderer(bundle, template) {
 return require('vue-server-renderer').createBundleRenderer(bundle, {
  template,
  cache: LRU({
   max: 1000,
   maxAge: 1000 * 60 * 5 // 组建缓存时间
  })
 })
}
let renderer
if (isProd) {
 // 生产环境使用本地打包文件来渲染
 const bundle = require('./output/vue-ssr-bundle.json')
 const template = fs.readFileSync(resolve('./output/index.html'), 'utf-8')
 renderer = createRenderer(bundle, template)
} else {
 // 开发环境使用webpack热更新服务
 require('./build/dev-server')(app, (bundle, template) => {
  renderer = createRenderer(bundle, template)
 })
}

 要缓存的组建

export default {
 name: 'Home',
 title() {
  return {
   title: 'vue-ssr',
   keywords: 'vue-ssr服务端脚手架, home',
   description: 'vue-ssr-template, vue-server-renderer, home'
  }
 },
 created() {
 },
 computed: {},
 asyncData({ store }) {},
 methods: {},
 serverCacheKey: props => props.id
}

 serverCacheKey 返回的 key 应该包含足够的信息,来表示渲染结果的具体情况。如果渲染结果仅由 props.item.id 决定,则上述是一个很好的实现。但是,如果具有相同 id 的 item 可能会随时间而变化,或者如果渲染结果依赖于其他 prop,则需要修改 serverCacheKey 的实现,以考虑其他变量。如果 serverCacheKey返回常量将导致组件始终被缓存,这对纯静态组件是有好处的。

总结

以上所述是小编给大家介绍的vue服务端渲染缓存应用详解 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
用Div仿showModalDialog模式菜单的效果的代码
Mar 05 Javascript
前端开发过程中浏览器版本的两种判定方法
Oct 30 Javascript
javascript实现鼠标拖动改变层大小的方法
Apr 30 Javascript
Express的路由详解
Dec 10 Javascript
js时间查询插件使用详解
Apr 07 Javascript
Angular4实现动态添加删除表单输入框功能
Aug 11 Javascript
JavaScript定时器setTimeout()和setInterval()详解
Aug 18 Javascript
浅谈Webpack下多环境配置的思路
Jun 27 Javascript
JS实现可视化文件上传
Sep 08 Javascript
详解关于webpack多入口热加载很慢的原因
Apr 24 Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
Jul 16 Javascript
JS绘图Flot应用图形绘制异常解决方案
Oct 16 Javascript
angularjs中判断ng-repeat是否迭代完的实例
Sep 12 #Javascript
如何解决React官方脚手架不支持Less的问题(小结)
Sep 12 #Javascript
详解JavaScript中操作符和表达式
Sep 12 #Javascript
JS 数组随机洗牌的实例代码
Sep 12 #Javascript
使用RN Animated做一个“添加购物车”动画的方法
Sep 12 #Javascript
小程序组件之仿微信通讯录的实现代码
Sep 12 #Javascript
Vue弹出菜单功能的实现代码
Sep 12 #Javascript
You might like
php 删除记录同时删除图片文件的实现代码
2010/05/12 PHP
PHP+原生态ajax实现的省市联动功能详解
2017/08/15 PHP
Laravel中获取路由参数Route Parameters的五种方法示例
2017/09/29 PHP
详解PHP神奇又有用的Trait
2019/03/25 PHP
ExtJS 2.2.1的grid控件在ie6中的显示问题
2009/05/04 Javascript
document.documentElement的一些使用技巧
2013/04/18 Javascript
我的Node.js学习之路(一)
2014/07/06 Javascript
javascript快速排序算法详解
2014/09/17 Javascript
修改或扩展jQuery原生方法的代码实例
2015/01/13 Javascript
Javascript中的arguments与重载介绍
2015/03/15 Javascript
jQuery EasyUI 菜单与按钮之创建简单的菜单和链接按钮
2015/11/18 Javascript
jQuery Easyui datagrid/treegrid 清空数据
2016/07/09 Javascript
AngularJS ng-blur 指令详解及简单实例
2016/07/30 Javascript
javascript代码调试之console.log 用法图文详解
2016/09/30 Javascript
ros::spin() 和 ros::spinOnce()函数的区别及详解
2016/10/01 Javascript
js图片轮播手动切换特效
2017/01/12 Javascript
JavaScript实现鼠标滚轮控制页面图片切换功能示例
2017/10/14 Javascript
vue2.5.2使用http请求获取静态json数据的实例代码
2018/02/27 Javascript
详解基于electron制作一个node压缩图片的桌面应用
2019/01/29 Javascript
[42:34]VP vs VG 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
深入浅析Python字符编码
2015/11/12 Python
Python批量修改文本文件内容的方法
2016/04/29 Python
Python+matplotlib实现计算两个信号的交叉谱密度实例
2018/01/08 Python
Python设计模式之MVC模式简单示例
2018/01/10 Python
详解python中的线程
2018/02/10 Python
PyCharm安装第三方库如Requests的图文教程
2018/05/18 Python
Python面向对象程序设计构造函数和析构函数用法分析
2019/04/12 Python
Python 改变数组类型为uint8的实现
2020/04/09 Python
Matplotlib animation模块实现动态图
2021/02/25 Python
Mytheresa美国官网:德国知名的女性奢侈品电商
2017/05/27 全球购物
应聘自荐书
2013/10/08 职场文书
销售活动策划方案
2014/08/26 职场文书
员工2014年度工作总结
2014/12/09 职场文书
go 实现简易端口扫描的示例
2021/05/22 Golang
python中的mysql数据库LIKE操作符详解
2021/07/01 MySQL
mysql 联合索引生效的条件及索引失效的条件
2021/11/20 MySQL