首页 > 其他分享 >浏览器缓存机制

浏览器缓存机制

时间:2024-06-04 17:48:12浏览次数:10  
标签:缓存 浏览器 filepath res require req fs const 机制

目录

一、浏览器缓存机制

1、LastModified
const http = require('http')
const url = require('url')
const path = require('path')
const fs = require('fs')
const mime = require('mime')

http.createServer(function (req, res) {
  const {pathname} = url.parse(req.url, true)
  const filepath = path.join(__dirname, pathname)
  fs.stat(filepath, (err, stats) => {
    if (err) {
      return sendError(req, res)
    } else {
      const ifModifiedSince = req.headers['if-modified-since']
      const LastModified = stats.ctime.toGMTString()
      if (ifModifiedSince === LastModified) {
        res.writeHead(304)
        res.end('')
      } else {
        return send(req, res, filepath, stats)
      }
    }
  })
}).listen(8080)

function sendError(req, res) {
  res.end('Not Found')
}

function send(req, res, filepath, stats) {
  res.setHeader('Content-Type', mime.getType(filepath))
  res.setHeader('Last-Modified', stats.ctime.toGMTString())
  fs.createReadStream(filepath).pipe(res)
}
2、ETag
const http = require('http')
const url = require('url')
const path = require('path')
const fs = require('fs')
const mime = require('mime')
const crypto = require('crypto')

http.createServer(function (req, res) {
  const {pathname} = url.parse(req.url, true)
  const filepath = path.join(__dirname, pathname)
  fs.stat(filepath, (err, stats) => {
    if (err) {
      return sendError(req, res)
    } else {
      const ifNoneMatch = req.headers['if-none-match']
      const out = fs.createReadStream(filepath)
      const md5 = crypto.createHash('md5');
      out.on('data', function (data) {
        md5.update(data)
      })
      out.on('end', function () {
        const etag = md5.digest('hex')
        if (ifNoneMatch === etag) {
          res.writeHead(304)
          res.end('')
        } else {
          return send(req, res, filepath, etag)
        }
      })
    }
  })
}).listen(8080)

function sendError(req, res) {
  res.end('Not Found')
}

function send(req, res, filepath, etag) {
  res.setHeader('Content-Type', mime.getType(filepath))
  res.setHeader('ETag', etag)
  fs.createReadStream(filepath).pipe(res)
}
3、expires
const http = require('http')
const url = require('url')
const path = require('path')
const fs = require('fs')
const mime = require('mime')

http.createServer(function (req, res) {
  const {pathname} = url.parse(req.url, true)
  const filepath = path.join(__dirname, pathname)
  console.log(filepath)
  fs.stat(filepath, (err, stats) => {
    if (err) {
      return sendError(req, res)
    } else {
      return send(req, res, filepath)
    }
  })
}).listen(8080)

function sendError(req, res) {
  res.end('Not Found')
}

function send(req, res, filepath) {
  res.setHeader('Content-Type', mime.getType(filepath))
  // http1.0使用,已弃用
  // res.setHeader('Expires', new Date(Date.now() + 30 * 1000).toUTCString())
  // http1.1使用,优先级高于Expires
  res.setHeader('Cache-Control', 'max-age=30')
  /**
   * 1、private:客户端可以缓存
   * 2、public:客户端和代理服务器都可以缓存
   * 3、max-age=60:缓存内容将在60秒后失效
   * 4、no-cache:需要使用对比缓存验证数据,强制向源服务器再次验证
   * 5、no-store:所有内容都不会缓存,强制缓存和对比缓存都不会触发
   */
  res.setHeader('Cache-Control', 'max-age=30')
  fs.createReadStream(filepath).pipe(res)
}

标签:缓存,浏览器,filepath,res,require,req,fs,const,机制
From: https://www.cnblogs.com/linding/p/18231364

相关文章

  • 【模型详解】从注意力机制到VIT到DETR,万字长文详解transformer在图像中的应用和
    学习视频:这个up的视频讲解的都很好很详细~self-Attention|自注意力机制|位置编码|理论+代码学习代码(也是该up主的github)https://github.com/Enzo-MiMan/cv_related_collections1注意力机制(Self-Attention和Multi-HeadAttention)1.1注意力机制中qkv的通俗理解若把......
  • 基于 PyTorch 的 Python 深度学习:注意力机制
    基于PyTorch的Python深度学习:注意力机制深度学习在近年来取得了巨大的进步,而注意力机制(AttentionMechanism)作为其中的一个重要概念,为模型提供了一种捕捉输入数据中不同部分之间关系的能力。在本文中,我们将探讨注意力机制的基本概念,以及如何在PyTorch框架下实现注意......
  • Linux定时任务清理docker构建缓存与镜像
    对于频繁构建镜像的服务器,Docker构建缓存会占用大量磁盘空间,需要定期清理,因此编写此定时任务;02**0定时器:每周日2:00;dockerimageprune移除所有无tag的镜像;dockerbuilderprune--keep-storage32000000000清理构建缓存,--keep-storage指定保留缓存的字节......
  • 聊聊Java中的动态代理机制
    引言动态代理是Java中一个非常强大的特性,它允许我们在运行时动态地创建代理对象。本文将深入探讨动态代理的工作原理、实现步骤以及在实际项目中的应用。第一部分:代理模式基础代理模式是一种结构型设计模式,它为其他对象提供一个代替或占位符以控制对它的访问。这种模式在......
  • 基于ReAct机制的AI Agent
    当前,在各个大厂纷纷卷LLM的情况下,各自都借助自己的LLM推出了自己的AIAgent,比如字节的Coze,百度的千帆等,还有开源的Dify。你是否想知道其中的原理?是否想过自己如何实现一套AIAgent?当然,借助LangChain就可以。1.简述AIAgent何为AIAgent呢?如果拿人来对比的话,半支烟认为AIAgent......
  • 浏览器缓存
    浏览器缓存分为强制缓存和协商缓存强制缓存就是浏览器向服务器请求资源,服务器响应头给予一个cache-control或者expires,在这个时间之内,就不会向服务器请求资源,但是强制缓存有个问题:如果服务端已经更新数据了,但是我们的本地浏览器还使用之前的旧数据,也就是使用本地的缓存,那......
  • C标准库的错误处理机制
    引言在C语言编程中,错误处理是确保程序健壮性和稳定性的重要部分。C标准库提供了一系列工具和函数,帮助开发者检测、报告和处理错误。本文将详细探讨C标准库的错误处理机制,包括标准错误处理函数、异常处理、错误代码以及错误处理的最佳实践。第一章:C标准库中的错误处理基础C......
  • 前端记忆函数和LRU缓存
    在Js中,“记忆化(Memoization)”是一种优化技术,它通过存储昂贵函数的结果,并复用这些结果以避免重复执行,从而可以加快代码执行速度。这种技术在处理递归和迭代问题时尤其有用。下面是一个记忆化函数的一般实现:functionmemoize(fn){letcache={}returnfunction(.......
  • TCP协议的核心机制
    TCP协议的核心机制一:确认应答机制1.2:超时重传接收缓冲区超时重传时间重置连接一:确认应答机制对于TCP协议来说,要解决的一个很重要的问题,就是可靠传输可靠传输,不是指发送方能够100%的把数据发送给接收方,而是尽可能.尤其是让发送方知道,接收方是否收到.举个......
  • 谷歌浏览器Lighthouse网页性能分析工具使用
    需要使用谷歌浏览器的无痕模式要不然其他浏览器插件的脚本会影响页面的性能判断使用截图操作界面点击分析按钮开始分析生成分析建议部分:红色是有必要解决的性能提升建议红色建议分析:lighthouse文档文档地址:https://developer.chrome.com/docs/lighthouse/perf......