html前端如何缓存页面,Nuxt中如何做页面html缓存

Nuxt是一款基于Vue的服务端渲染SSR框架

在Nuxt框架的API中,有一个叫 serverMiddleware 的服务端中间件,我们可以利用它在返回首屏html前做一些缓存的处理

8c2bb52ffcc593179ca2033eb057298a.png

在这之前我们需要了解一个叫LRU的算法,LRU是一种缓存淘汰算法,用链表存储数据,最新插入的数据会排在链表头部,已缓存的数据收到访问也会被移到链表的头部,链表有长度限制,满了的时候排在尾部的数组将被丢弃。

进入正题,实现html缓存我们需要两个包,一个是lru-cache,一个是etag

(lru-cache是别人封装好的一个lru存储类,etag是用来为实体内容产生一个strong etag)

建一个pageCache.js,引入这两个包

import LRU from 'lru-cache';

import etag from 'etag';

const cacheStore = new LRU({

max: 10000, // 设置最大的缓存个数

maxAge: 5 * 60 * 1000 // 5分钟

});

复制代码

我们可以根据需要调整max和maxAge,来控制LRU缓存

c051c3c8a4f44760ac66fd1d1a7440a8.png

接着我们来自定义一个serverMiddleware

import LRU from 'lru-cache';

import etag from 'etag';

const cacheStore = new LRU({

max: 10000, // 设置最大的缓存个数

maxAge: 5 * 60 * 1000 // 5分钟

});

export default function(req, res, next) {

const isDev = process.env.NODE_ENV === 'development'

// 开发环境为了方便开发,就不走缓存

if (isDev) {

return next()

}

// 此次我们只针对html做缓存

if (req.headers.accept &&

(req.headers.accept.indexOf('text/html') === -1

&& req.headers.accept.indexOf('application/xhtml+xml') === -1

&& req.headers.accept.indexOf('application/xml') === -1)

) {

return next()

}

// 用页面url的pathname作为LRU缓存的key值

let key = req._parsedOriginalUrl.pathname

// 获取LRU中的缓存

const { etag: curEtag, value } = cacheStore.get(key) || {}

if (value) {

// 如果命中缓存,则看是否命中协商缓存,是则直接返回304,不是则返回200和数据

if (curEtag === req.hedaers['if-none-match']) {

res.writeHead(304)

return res.end()

} else {

res.writeHead(200, {

'Content-Type': 'text/html;charset=utf-8',

'Cache-Control': 'private, max-age=60',

'Etag': curEtag

})

}

} else {

// 如果缓存没命中,则返回请求的内容

// 缓存原先的res.end

res.original_end = res.end

// 重写res.end方法,nuxt服务器响应时会调用res.end

res.end = function(data) {

if (res.statusCode === 200) {

// 将该页面请求html内容存进LRU

// 第三个参数缓存时间传undefined则走起初cacheStore定义时的5分钟

cacheStore.set(key, { etag: etag(data), value: data }, undefined)

}

// html设置客户端强缓存60s

res.setHeader('Cache-Control', 'private, max-age=60')

// 最终返回请求的内容

return res.original_end(data, 'utf-8')

}

retun next()

}

}

复制代码

然后我们在nuxt.config.js内配上这个中间件就可以了

serverMiddleware: [ '~/../pageCache']

复制代码

看起来好像OK了

ちょっと待って

我们页面url不可避免会有参数,而且参数可能会影响页面的内容,如果我们只是用页面url的pathname做缓存的key的话,会导致不同参数的url访问到的内容都命中了同一个缓存,那该怎么办呢?很简单,我们用 pathname+query 作为缓存的key就可以了

import { parse, stringify } from 'querystring';

let key = req._parsedOriginalUrl.pathname;

//是否是需要缓存的x页面

if(req._parsedOriginalUrl.pathname.toLowerCase().indexOf('/x') >= 0){

const query = parse(req._parsedUrl.query)

const queryStr = stringify({ ...query })

key = key + '?' + queryStr;

}

复制代码

大功告成!

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

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

相关文章

Google 和 bing 都无法替代的10大深网搜索引擎

From:https://blog.csdn.net/ejinxian/article/details/74081716 当我们想要搜索某些内容时,我们第一个想到的就是打开Google、百度或必应这类的搜索引擎。但针对有些内容,却是这些常规搜索引擎无法获取到的,那就是隐藏在深网的内…

植树节html5游戏,植树节活动

活动概述活动时间:3月10日至3月13日(以实际版本内活动日期为准)活动介绍:一年一度的植树节活动开始了,小伙伴们拿起小铲子,小水桶,今天勤劳来种树,明天不用吸雾霾!快来邀请你的小伙伴一同参与活动吧,开开心…

Swagger 注解~用于Controller

Api 用于类;表示标识这个类是swagger的资源 tags–表示说明 value–也是说明,可以使用tags替代但是tags如果有多个值,会生成多个list Api(value"用户controller",tags{"用户操作接口"}) RestController public class Us…

大黄蜂(HORNET):比Tor更快更安全的匿名网络

From:https://blog.csdn.net/lee_sire/article/details/50357234 你一定听说过Tor洋葱路由技术,它提供了强大的匿名网络访问功能,以此成为互联网用户、政治活动家、以及记者躲避有关部门限制监控的方法。但Tor最受人诟病的是它蜗牛般的网络连…

HTML在前端开发中起到的作用,什么是字符串,web前端开发里起到什么作用

观察某宝商品数据,有一个东西叫服务器>>>>js的作用重要作用之一>>>>交互>>>>人机交互(事件)>>>>服务器交互(ajax);服务器交互,数据处理方式json>>>>>要把它转化成字符串操作。字符串操作…

Swagger 注解~用于方法

ApiOperation 用于方法;表示一个http请求的操作 value用于方法描述 notes用于提示内容 tags可以重新分组(视情况而用)ApiParam 用于参数,字段说明;表示对参数的添加元数据(说明或是否必填等) na…

如何使用Linux匿名上网-四大法宝

From:https://www.linuxprobe.com/linux-anonymity-internet.html 导读 信息时代给我们的生活带来极大便利和好处的同时也带来了很大的风险。一方面,人们只要点击几下按钮,就能基本上访问已知存在的全部信息和知识;另一方面,要是这…

怎么改HTML表单数据,form设置的数据怎么添加到table

如图: 是一个form表单,在顶部输入数据点击新增,怎么把数据插入到下面的表格中,并显示。页面代码:编辑跳转表单的代码:showEditForm(text) >{const data_save this.props.signal.data_save.dataconst da…

Swagger 注解~用于模型

ApiModel 用于模型类 ;表示对类进行说明,用于参数用实体类接收 value–表示对象名 description–描述 都可省略ApiModelProperty 用于字段; 表示对model属性的说明或者数据操作更改 value–字段说明 name–重写属性名字 dataType–重写属性类…

命令行下 pdb 调试 Python 程序

官方参考网站 The Python Debugger : https://docs.python.org/3/library/pdb.html gdb 调试命令的使用及总结:https://blog.csdn.net/freeking101/article/details/54406982 使用 Pdb 调试 Python:https://segmentfault.com/a/1190000006628…

2021年高考成绩查询山东德洲,2021年德州高考状元是谁分数多少分,历年德州高考状元名单...

2020年德州一年一度的高考考试已经结束,今年德州高考状元是谁呢,德州高考状元出自哪个高中学校,文理科分数是多少分,一起来了解。一、2020年德州高考状元名单资料2020年德州高考状元名单和学校相关信息,截至目前发文时…

Swagger 注解~其他

ApiIgnore 用于类或者方法上,可以不被swagger显示在页面上 比较简单, 这里不做举例 ApiImplicitParam 用于方法,表示单独的请求参数ApiImplicitParams 用于方法,包含多个 ApiImplicitParam name–参数ming value–参数说明 dataType–数据类…

python3 爬虫实战 :用 Appium 抓取手机 app 微信朋友圈的数据

From:https://blog.csdn.net/Fan_shui/article/details/81413595 本编教程从 appium 的环境配置开始,到抓取手机 app 微信朋友圈结束。 知乎:https://zhuanlan.zhihu.com/p/41311503 GitHub:https://github.com/FanShuixing/git_…

SharePoint 2010中的内容类型集线器 - 内容类型发布与订阅

原文地址:http://www.chakkaradeep.com/post/SharePoint-2010-Content-Type-Hubs-e28093-Publish-and-Subscribe-to-Content-Types.aspx 注:此博客帖子是基于SharePoint2010技术预览版本。 MOSS 2007 假设您有一个网站集Web Application1 ,在…

如何用“底层逻辑”,看清世界的底牌?

来源:如何用“底层逻辑”,看清世界的底牌? 我的新书《底层逻辑》,终于要和大家见面了。 我常说,只有底层逻辑才有生命力。 因为底层逻辑在面临变化的时候,能够应用到新的变化里面,会产生出新…

python3 爬虫实战:mitmproxy 对接 python 下载抖音小视频

From:https://blog.csdn.net/Fan_shui/article/details/81461253 一、前言 前面我们已经用 appium 爬取了微信朋友圈,今天我们学习下 mitmproxy,mitmproxy 是干什么的呢,它跟 charles 和 fiddler类似,是一个抓包工具&a…

python3 爬虫实战:为爬虫添加 GUI 图像界面 之 tkinter

From:https://blog.csdn.net/Fan_shui/article/details/81611752 一、前言 前面我们写的爬虫只能运行在具有python环境的电脑上,若是把源代码发给别人,很大可能性是运行不了的,所以我们本节的目的是为爬虫创建 GUI 界面&#xff0…

22条API设计的实践

来源:22条API设计的最佳实践 来源:dockone.io/article/2434604 原文:https://betterprogramming.pub/22-best-practices-to-take-your-api-design-skills-to-the-next-level-65569b200b9 曾经因为一个糟糕的API而感到沮丧吗? 在…

linux python 永久添加自己的模块路径

Linux 环境变量配置 : https://blog.csdn.net/freeking101/article/details/81013045 linux python 永久添加自己的模块路径 添加路径: cd /usr/local/python3/lib/python3.6/site-packages vi my.pth 1 . 临时性添加>>>import sys >>>sys.path.a…