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

作者:光屁股的小破孩 时间:2024-04-30 10:37:30 

什么是服务器端渲染(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服务端渲染添加缓存的方法 网站的支持!

来源:http://www.cnblogs.com/wing-sky/p/9664320.html

标签:vue,服务端,渲染,缓存
0
投稿

猜你喜欢

  • Python脚本导出为exe程序的方法

    2022-08-22 21:33:05
  • 解决python3爬虫无法显示中文的问题

    2022-11-27 15:18:59
  • vue.extend与vue.component的区别和联系

    2024-05-29 22:45:47
  • 讲解MySQL数据库的数据类型和建库策略

    2008-12-17 14:39:00
  • 客户端JavaScript代码封装

    2008-12-26 18:10:00
  • mysql实现设置定时任务的方法分析

    2024-01-18 03:37:18
  • Python GUI布局工具Tkinter入门之旅

    2021-11-08 14:38:23
  • Python数据分析 Numpy 的使用方法

    2023-01-14 15:12:36
  • java编写创建数据库和表的程序

    2024-01-19 17:24:40
  • 浅谈python中频繁的print到底能浪费多长时间

    2022-01-31 06:24:34
  • python使用Flask框架获取用户IP地址的方法

    2023-08-09 03:15:23
  • sql删除重复数据的详细方法

    2024-01-14 15:22:21
  • python实战之Scrapy框架爬虫爬取微博热搜

    2022-07-08 02:09:50
  • vue-cli项目中遇到的eslint的坑及解决

    2024-05-29 22:23:22
  • Yii框架登录流程分析

    2024-05-11 09:19:43
  • 在OneProxy的基础上实行MySQL读写分离与负载均衡

    2024-01-12 22:54:28
  • MYSQL初学者使用指南[适用自己安装mysql者]

    2007-08-06 14:53:00
  • OpenCV半小时掌握基本操作之边界填充

    2022-07-15 15:10:33
  • 教你怎么用Python生成九宫格照片

    2023-12-02 17:20:51
  • selenium3.0+python之环境搭建的方法步骤

    2023-03-20 06:00:22
  • asp之家 网络编程 m.aspxhome.com