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 相关文章推荐
JavaScript 页面编码与浏览器类型判断代码
Jun 03 Javascript
js实现网站首页图片滚动显示
Feb 04 Javascript
JavaScript分析、压缩工具JavaScript Analyser
Dec 31 Javascript
javascript手工制作悬浮菜单
Feb 12 Javascript
JavaScript中匿名函数用法实例
Mar 23 Javascript
JS获取iframe中marginHeight和marginWidth属性的方法
Apr 01 Javascript
AngularJS控制器之间的通信方式详解
Nov 03 Javascript
jQuery Masonry瀑布流插件使用方法详解
Jan 18 Javascript
Bootstrap面板学习使用
Feb 09 Javascript
jquery PrintArea 实现票据的套打功能(代码)
Mar 17 Javascript
vue.js 使用axios实现下载功能的示例
Mar 05 Javascript
JavaScript中isPrototypeOf函数
Nov 07 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 ignore_user_abort与register_shutdown_function 使用方法
2009/06/14 PHP
PHP 全角转半角实现代码
2010/05/16 PHP
PHP的加密方式及原理
2012/06/14 PHP
PHP使用trim函数去除字符串左右空格及特殊字符实例
2016/01/07 PHP
PHP使用Nginx实现反向代理
2017/09/20 PHP
Javascript load Page,load css,load js实现代码
2010/03/31 Javascript
jQuery最佳实践完整篇
2011/08/20 Javascript
js中传递特殊字符(+,&)的方法
2014/01/16 Javascript
js H5 canvas投篮小游戏
2016/08/18 Javascript
使用微信内嵌H5网页解决JS倒计时失效问题
2017/01/13 Javascript
最基础的vue.js双向绑定操作
2017/08/23 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
2017/12/07 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
详解从0开始搭建微信小程序(前后端)的全过程
2019/04/15 Javascript
关于AngularJS中几种Providers的区别总结
2020/05/17 Javascript
Python数据结构之顺序表的实现代码示例
2017/11/15 Python
Python编写Windows Service服务程序
2018/01/04 Python
Flask框架配置与调试操作示例
2018/07/23 Python
Python2与Python3的区别实例分析
2019/04/11 Python
详解用python生成随机数的几种方法
2019/08/04 Python
django 连接数据库 sqlite的例子
2019/08/14 Python
Python的Lambda函数用法详解
2019/09/03 Python
Numpy将二维数组添加到空数组的实现
2019/12/05 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
2020/04/20 Python
Python使用socket_TCP实现小文件下载功能
2020/10/09 Python
谈一谈HTML5本地存储技术
2016/03/02 HTML / CSS
巴西美妆购物网站:Kutiz Beauté
2019/03/13 全球购物
主治医师岗位职责
2013/12/10 职场文书
追悼会子女答谢词
2014/01/28 职场文书
2014最新党员违纪检讨书
2014/10/12 职场文书
教师个人查摆剖析材料
2014/10/14 职场文书
golang fmt格式“占位符”的实例用法详解
2021/07/04 Golang
Javascript中Microtask和Macrotask鲜为人知的知识点
2022/04/02 Javascript
Spring Boot 使用 Spring-Retry 进行重试框架
2022/04/24 Java/Android
Python中的 enumerate和zip详情
2022/05/30 Python
Tomcat 与 maven 的安装与使用教程
2022/06/16 Servers