vue服务端渲染添加缓存

虽然 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({ <br> max: 100,<br> maxAge: 5000 // 设置数据多久过期<br>})

export function createAPI({baseUrl, timeout}) {
let api
复制代码
if (process.__API__) { api = process.__API__ } else {<br>// 定义全局变量 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)})})}}}<br>return api<br>}复制代码


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Could not autowire. No beans of 'xxxx' type found的错误提示

spring 集成mybatis 找不到 beans 查了很多网页&#xff0c;解决办法是&#xff1a; 在PersonMapper 上加 Repositorypackage zengmiaogen.csdn.cn.mybatis;import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository;import java.ut…

怎么把页面按比例缩小_做PPT多图排版千万别套模板了,按这28种版式来,绝对靠谱!...

编按&#xff1a;各种类型的PPT经常会用到图片&#xff0c;这些图片到底如何排版才更出色呢&#xff1f;今天给大家分享一篇PPT图片排版手册&#xff0c;主要介绍了多张图常见的排版方式&#xff0c;希望能帮助到您&#xff01;嗨&#xff0c;大家好&#xff0c;我是P小白。一张…

spring boot 集成Mybatis时 Invalid bound statement (not found)

spring boot 集成Mybatis时&#xff0c;运行提示 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): zengmiaogen.csdn.cn.mybatis.PersonMapper.queryPersonList 按照下文的步骤&#xff0c;解决了问题 https://blog.csdn.net/qq_3598128…

Caffe CuDNN版本与环境不同导致make错误

1.将./include/caffe/util/cudnn.hpp 换成最新版的caffe里的cudnn的实现&#xff0c;即相应的cudnn.hpp. 2.将./include/caffe/layers里的&#xff0c;所有以cudnn开头的文件&#xff0c;例如cudnn_conv_layer.hpp&#xff0c;都替换成最新版的caffe里的相应的同名文件。 3.将.…

nodejs 安装 nrm

nodejs默认源在国外&#xff0c;访问速度慢。可以手动修改源&#xff0c;但要每次都修改。 安装 nrm&#xff0c;指定源路径&#xff0c;不需要每次修改 npm install nrm -g nrm ls * npm -------- https://registry.npmjs.org/ yarn ------- https://registry.yarnpkg.co…

磁盘阵列怎么做_设计与后期制作该怎么选择笔记本电脑?朋克老师来教你

最近有很多人问我设计与后期制作该怎么选择笔记本电脑&#xff1f;既然选择笔记本电脑就说明在相关工作中对电脑有移动需求&#xff0c;比如自媒体、记者、影视后期出组人员等等&#xff0c;那该如何选择呢&#xff1f;视频剪辑咱们按工作内容分类聊一聊。第一类&#xff0c;平…

EventBus源码分析

简介 前面我学习了如何使用EventBus&#xff0c;还有了解了EventBus的特性&#xff0c;那么接下来我们一起来学习EventBus的源码&#xff0c;查看EventBus的源码&#xff0c;看看EventBus给我们带来什么惊喜以及编程思想。 这个图我们从一开始就一直放置在上面了。我们在来回顾…

Vue.js 概述与 MVVM 模式

一、Vue.js 1. Vue.js 是什么 Vue.js 是一个轻巧、高性能、可组件化的 MVVM 库&#xff0c;拥有非常容易上手的 API&#xff1b; Vue.js是一个构建数据驱动的 Web 界面的库。 2. Vue.js 的特性 1. 轻量级的框架 2. 双向数据绑定 3. 指令 4. 插件化&#xff08;组件化&#…

ipad录屏软件_如何在 Mac 上优雅的截图和录屏

在使用电脑的时候&#xff0c;很多时候我们都需要截屏或者录屏分享。所以你可能已经听过 snip&#xff0c;或者经常使用 QQ、微信 等软件来实现截屏。但是今天我们一起来看一下&#xff0c;怎么使用系统提供的功能&#xff0c;来优雅的实现截图和录屏。最开始的这几篇都比较基础…

数据库的辅助工具:My-SqlViewer

阅读目录开始My-SqlViewer 使用说明程序安装及启动说明程序主界面DataBase浏览器搜索数据库存储过程的复制比较数据库今天发一个我自己写的且经常使用的数据库的辅助工具&#xff1a;My-SqlViewer由于我比较喜欢使用存储过程&#xff0c;但发现不管是SQL Server Management Stu…

安卓平板微信和手机微信同时登陆_Mac电脑如何同时登陆多个微信或QQ

现如今&#xff0c;微信和QQ已经不单单是简单的社交软件了&#xff0c;也成了工作必备软件&#xff0c;工作中用它传个文件&#xff0c;发个通知&#xff0c;不知道有多方便。但是很多人希望将工作圈和生活圈分开&#xff0c;有人想出拿两部手机的方法&#xff0c;倒是可以&…

VSCode 开发Vue必备插件

工欲善其事&#xff0c;必先利其器 以下就是开发Vue必备插件&#xff1a; Vetur —— 语法高亮、智能感知、Emmet等 包含格式化功能&#xff0c; AltShiftF &#xff08;格式化全文&#xff09;&#xff0c;CtrlK CtrlF&#xff08;格式化选中代码&#xff0c;两个Ctrl需要同时…

苹果x人脸识别突然失灵_教你解决mac电脑键盘失灵的问题

无论是使用WIN系统还是苹果电脑都有可能遇到键盘失灵&#xff0c;无法使用的问题&#xff0c;那么苹果电脑键盘失灵该怎么解决呢&#xff1f;这里macw小编为大家带来了苹果电脑键盘失灵解决教程&#xff0c;赶紧收藏起来吧&#xff01;无线键盘失灵解决教程1、确保蓝牙已启用并…

产品文档如何说清楚产品业务?关注这几点就够了

如果产品文档没把产品业务说清楚会有什么影响&#xff1f; 常见的&#xff1a;产品不符合业务&#xff08;实际使用场景&#xff09;&#xff0c;验收不通过&#xff0c;需要加班修改&#xff0c;调整。产品经理被骂。 严重的&#xff1a;甲方爸爸受不了了&#xff0c;换供应…

前端错误日志收集方案

前言 公司的项目上线出现问题后难以定位错误&#xff0c;研究过现存的错误监控方案&#xff0c;受限于特殊条件只能定制自己的错误收集方案。 基于以上背景我撸出来一个错误日志收集方案 - Ohbug。 欢迎各位大佬 star ~ 监控错误 说起错误的捕获&#xff0c;首先想到的是 try c…

spring入门到放弃——spring事务管理

Spring事务提供了两种管理的的方式&#xff1a;编程式事务和声明式事务 简单回顾下事务&#xff1a; 事务&#xff1a;逻辑上的一组操作&#xff0c;组成操作的各个单元&#xff0c;要么全部成功&#xff0c;要么全部失败。 事务特性&#xff1a; 原子性&#xff1a;一个事务包…

高德百度地图如何获取附近小区酒店银行等?

概述 实现以下功能&#xff1a;根据当前定位&#xff0c;查找附近小区 实现步骤 高德&#xff0c;百度地图实现方式相同&#xff0c;步骤都是如下&#xff1a; 1.获取当前位置的经纬度 2.查询poitype编码。 &#xff08;小区&#xff0c;写字楼&#xff0c;银行&#xff0…

angular 字符串转换成数字_Python基础语法大全:字符串的处理与使用

本文来自牛鹭学院学员&#xff1a;邓瑞杰字母处理string.capitalize()返回元字符串&#xff0c;且将字符串第一个字母转为大写&#xff0c;其它字母小写string.title()返回元字符串&#xff0c;且将字符串第一个字母转为大写&#xff0c;其它字母小写string.swapcase()用于对字…

Java实现MD5编码32位

加入依赖包 <dependency><groupId>org.apache.directory.studio</groupId><artifactId>org.apache.commons.codec</artifactId><version>1.8</version></dependency> 实现代码 DigestUtils.md5Hex(字符串)

计算机二级考试python_全国计算机等级考试考试大纲(2018年版)

级别 大纲名称 一级 一级计算机基础及WPS Office应用考试大纲&#xff08;2018年版&#xff09;点击下载 一级计算机基础及MS Office应用考试大纲&#xff08;2018年版&#xff09;点击下载 一级计算机基础及Photoshop应用考试大纲&#xff08;2018年版&#xff09;点击下载 一…