vue服务端渲染添加缓存的方法


Posted in Javascript onSeptember 18, 2018

什么是服务器端渲染(SSR)?

Vue.js 是构建客户端应用程序的框架。默认情况下,可以在浏览器中输出 Vue 组件,进行生成 DOM 和操作 DOM。然而,也可以将同一个组件渲染为服务器端的 HTML 字符串,将它们直接发送到浏览器,最后将这些静态标记"激活"为客户端上完全可交互的应用程序。

服务器渲染的 Vue.js 应用程序也可以被认为是"同构"或"通用",因为应用程序的大部分代码都可以在服务器和客户端上运行。

缓存

虽然 Vue 的服务器端渲染(SSR)相当快速,但是由于创建组件实例和虚拟 DOM 节点的开销,无法与纯基于字符串拼接(pure string-based)的模板的性能相当。在 SSR 性能至关重要的情况下,明智地利用缓存策略,可以极大改善响应时间并减少服务器负载。

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 返回常量将导致组件始终被缓存,这对纯静态组件是有好处的。

接口缓存:

在create-api-server.js中设置缓存

import qs from 'qs'
import axios from 'axios'
import md5 from 'md5'
import LRU from 'lru-cache'
const microCache = LRU({ 
max: 100,

maxAge: 5000 // 设置数据多久过期
})
export function createAPI({baseUrl, timeout}) {
let api
if (process.__API__) { api = process.__API__ } else {
// 定义全局变量 process.__API__
  api = process.__API__ = {
   get(url, params = {}) {
    const key = md5(url + JSON.stringify(params))
    // 判断是否有缓存,直接返回缓存结果
    if (params.cache && microCache.get(key)) {
     console.log('返回缓存')
     return Promise.resolve(microCache.get(key))
    }
    return new Promise((resolve, reject) => {
     axios({
      url,
      params,
      headers: {
       'X-Requested-With': 'XMLHttpRequest'
       // 'Cookie': parseCookie(SSR.cookies)
      },
      method: 'get'
     }).then(res => {
      // 判断是否需要缓存 如果需要缓存缓存数据
      if (params.cache && microCache) {
       microCache.set(key, res.data)
      }
      console.log('返回新数据')
      resolve(res.data)
     }).catch(error => {
      reject(error)
     })
    })
   },
   post(url, params = {}) {
    const key = md5(url + JSON.stringify(params))
    // 判断是否有缓存,直接返回缓存结果
    if (params.cache && microCache.get(key)) {
     return Promise.resolve(microCache.get(key))
    }
    return new Promise((resolve, reject) => {
     axios({
      url,
      data: qs.stringify(params),
      method: 'post',
      headers: {
       'X-Requested-With': 'XMLHttpRequest',
       'Content-Type': 'application/x-www-form-urlencoded'
       // 'Cookie': parseCookie(SSR.cookies)
      }
     }).then(res => {
      // 判断是否需要缓存 如果需要缓存缓存数据
      if (params.cache && microCache) {
       microCache.set(key, res.data)
      }
      resolve(res.data)
     }).catch(error => {
      reject(error)
     })
    })
   }
  }
 }
return api
}

总结

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

Javascript 相关文章推荐
抽出www.templatemonster.com的鼠标悬停加载大图模板的代码
Jul 11 Javascript
css transform 3D幻灯片特效实现步骤解读
Mar 27 Javascript
jquery实现table鼠标经过变色代码
Sep 25 Javascript
本人自用的global.js库源码分享
Feb 28 Javascript
jQuery EasyUI中的日期控件DateBox修改方法
Nov 09 Javascript
原生js jquery ajax请求以及jsonp的调用方法
Aug 04 jQuery
解决vue build打包之后首页白屏的问题
Mar 06 Javascript
解决vue 路由变化页面数据不刷新的问题
Mar 13 Javascript
vue数据初始化initState的实例详解
Apr 11 Javascript
解决vue项目router切换太慢问题
Jul 19 Javascript
vue添加锚点,实现滚动页面时锚点添加相应的class操作
Aug 10 Javascript
低门槛开发iOS、Android、小程序应用的前端框架详解
Oct 16 Javascript
在Vuex使用dispatch和commit来调用mutations的区别详解
Sep 18 #Javascript
微信小程序开发之路由切换页面重定向问题
Sep 18 #Javascript
在小程序中使用canvas的方法示例
Sep 17 #Javascript
webpack4打包vue前端多页面项目
Sep 17 #Javascript
node中的密码安全(加密)
Sep 17 #Javascript
Vue CLI3搭建的项目中路径相关问题的解决
Sep 17 #Javascript
浅谈webpack SplitChunksPlugin实用指南
Sep 17 #Javascript
You might like
PHP+MySQL 制作简单的留言本
2009/11/02 PHP
PHP实现的MongoDB数据库操作类分享
2014/05/12 PHP
golang 调用 php7详解及实例
2017/01/04 PHP
PHP中抽象类,接口功能、定义方法示例
2019/02/26 PHP
基于PHP+Mysql简单实现了图书购物车系统的实例详解
2020/08/06 PHP
html数组字符串拼接的最快方法
2009/09/16 Javascript
Jquery 1.42 checkbox 全选和反选代码
2010/03/27 Javascript
在JS中如何调用JSP中的变量
2014/01/22 Javascript
script标签属性用type还是language
2015/01/21 Javascript
基于JavaScript实现类似于百度学术高级检索功能
2016/03/02 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
vue 打包后的文件部署到express服务器上的方法
2017/08/09 Javascript
详解webpack+express多页站点开发
2017/12/22 Javascript
详解关于Angular4 ng-zorro使用过程中遇到的问题
2018/12/05 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
2018/12/05 Javascript
基于Node的Axure文件在线预览的实现代码
2019/08/28 Javascript
微信小程序自定义yPicker组件实现省市区三级联动功能
2020/10/29 Javascript
实例讲解Python脚本成为Windows中运行的exe文件
2019/01/24 Python
numpy下的flatten()函数用法详解
2019/05/27 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
Django查询优化及ajax编码格式原理解析
2020/03/25 Python
python实现四人制扑克牌游戏
2020/04/22 Python
利用Python实现Excel的文件间的数据匹配功能
2020/06/16 Python
HTML5是否真的可以取代Flash
2010/02/10 HTML / CSS
美国存储和组织商店:The Container Store
2017/08/16 全球购物
创业计划书的写作技巧及要点
2014/01/31 职场文书
大学新生军训方案
2014/05/03 职场文书
建设幸福中国演讲稿
2014/09/11 职场文书
小学班主任事迹材料
2014/12/17 职场文书
毕业设计论文评语
2014/12/31 职场文书
会计实训总结范文
2015/08/03 职场文书
小学记事作文之200字
2019/08/06 职场文书
JS ES6异步解决方案
2021/04/29 Javascript
使用Pytorch实现two-head(多输出)模型的操作
2021/05/28 Python
python中Matplotlib绘制直线的实例代码
2021/07/04 Python
python通过新建环境安装tfx的问题
2022/05/20 Python