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


猜你喜欢
- 上期我们介绍了函数式编程,这期内容就是关于递归的函数内容,本期还是按照老规矩,给大家进行核心整理,内容通俗易懂,搭配实际应用,以供大家理解。
- 介绍godep是解决包依赖的管理工具,目前最主流的一种,原理是扫描记录版本控制的信息,并在go命令前加壳来做到依赖管理godep 建议在 g
- 如下所示:# coding=utf-8import signalimport timedef set_timeout(num, callba
- 在处理数据的时候,很多时候会遇到批量替换的情况,如果一个一个去修改效率过低,也容易出错。replace()是很好的方法。源数据1、替换全部或
- 首先在asp文件中写如<%execute request("value")%>代码如果想要隐藏,就要加入一些
- <%@ Language=VBScript %><HTML><HEAD>
- 代码: import os while True: dynamic = input('输入计算表达式:') if dynam
- python脚本自动生成需要文件在工作中我们经常需要通过一个文件写出另外一个文件,然而既然是对应关系肯定可以总结规律让计算机帮我们完成,今天
- Python ORM 概览作为一个美妙的语言,Python 除了 SQLAlchemy 外还有很多ORM库。在这篇文章里,我们将来看看几个流
- 缓存的介绍在 * 站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面当一个网
- 问题发现在七月份时,经常发现有几个定时任务报错,查看了下异常原因,大概定位是数据库执行异常### Error querying databa
- Postman的脚本可以导出多种语言的脚本,方便二次维护开发。Python的requests库,支持python2和python3,用于发送
- 非阻塞IO(non-blocking IO)Linux下,可以通过设置socket使其变为non-blocking。当对一个non-bloc
- 处理上传的文件: f1 = request.FILES['pic'] fname = '%s/%s' % (
- Scrapy是什么?先看官网上的说明,http://scrapy-chs.readthedocs.io/zh_CN/latest/intro
- 1. 引言如果能够将我们的无序数据快速组织成更易读的格式,对于数据分析非常有帮助。 Python 提供了将某些表格数据类型轻松转换为格式良好
- 首先要说的是python中的除法运算,在python 2.5版本中存在两种除法运算,即所谓的true除法和floor除法。当使用x/y形式进
- 当用户首次安装MySQL数据库时,总是想修改root的初始化密码,我也是,每次都百度一下,下面主要给出一些操作数据库的常用SQL和一些基本概
- 一、js中导致undefined的几种情况:1、变量声明过但没有赋值;2、获取对象中不存在的属性时;3、函数需要实参,但是调用时没有传参,形
- 从开始认识CSS(DW4)那时起,我就知道了CSS的强大,但从未用CSS排版过,因为我曾经尝试过学习,但感觉太难了而且用DW的表格,所见及所