当前位置:首页 > 技术 > 正文内容

浏览器缓存机制详解

访客 技术 2026年6月18日 1

浏览器缓存技术通过两种主要模式优化网络性能:强制缓存(强缓存)和协商缓存。这两种机制共同作用可显著减少网络请求量。

1. 缓存处理流程

当浏览器访问资源时,系统会执行如下流程:

  1. 检查本地缓存是否存在有效数据
  2. 若存在强缓存数据则直接使用
  3. 若强缓存失效则触发协商缓存验证
  4. 服务器根据验证结果返回304未修改或200新资源
  5. 最终完成页面渲染

2. 强制缓存实现

强制缓存无需与服务器通信,直接使用本地存储的资源。

2.1 HTTP头部配置

  • Cache-Control:控制缓存策略
    - max-age=3600 设置有效期
    - no-cache 禁用强制缓存
    - public/private 控制缓存范围
  • Expires:指定过期时间戳

2.2 服务端配置示例


// 使用Express框架配置
app.use('/static', express.static('public', {
  maxAge: '1y',
  etag: false,
  lastModified: false
}));

2.3 缓存验证逻辑


function checkCacheValidity(cacheData) {
  const now = Date.now();
  if (cacheData.headers['cache-control']) {
    const maxAge = parseMaxAge(cacheData.headers['cache-control']);
    return now - cacheData.timestamp < maxAge * 1000;
  }
  return now < new Date(cacheData.headers.expires).getTime();
}

3. 协商缓存机制

当强制缓存失效后,浏览器通过验证请求判断资源是否更新。

3.1 验证头部参数

  • Last-Modified / If-Modified-Since:时间戳验证
  • ETag / If-None-Match:唯一标识验证

3.2 服务端实现示例


app.get('/api/data', (req, res) => {
  const data = fetchData();
  const etag = generateHash(data);
  
  if (req.headers['if-none-match'] === etag) {
    return res.status(304).end();
  }
  
  res.setHeader('ETag', etag);
  res.setHeader('Last-Modified', new Date().toUTCString());
  res.json(data);
});

3.3 验证流程实现


async function validateResource(url, cachedData) {
  const headers = {
    'If-None-Match': cachedData.etag,
    'If-Modified-Since': cachedData.lastModified
  };
  
  try {
    const response = await fetch(url, { headers });
    
    if (response.status === 304) {
      return { status: 'hit', data: cachedData };
    } else {
      const newData = await response.json();
      return { status: 'update', data: newData };
    }
  } catch {
    return { status: 'fallback', data: cachedData };
  }
}

4. 实际应用配置

4.1 Nginx配置方案


server {
  location ~ \.(js|css)$ {
    expires 365d;
    add_header Cache-Control "public, immutable";
    etag on;
  }
  
  location ~ \.(html)$ {
    expires 1h;
    add_header Cache-Control "public, must-revalidate";
    etag on;
  }
}

4.2 Webpack构建优化


module.exports = {
  output: {
    filename: '[name].[contenthash].js',
    chunkFilename: '[name].[contenthash].chunk.js'
  },
  optimization: {
    splitChunks: {
      cacheGroups: {
        vendor: {
          test: /[\\/]node_modules[\\/]/,
          name: 'vendors',
          chunks: 'all'
        }
      }
    }
  }
};

5. 缓存策略建议

资源类型推荐策略配置示例
静态资源强缓存+版本号Cache-Control: public, max-age=31536000, immutable
HTML文件协商缓存Cache-Control: no-cache
API响应协商缓存Cache-Control: no-cache
用户数据禁用缓存Cache-Control: no-store

6. 调试工具使用


function analyzeCachePerformance() {
  performance.getEntriesByName('example.com').forEach(entry => {
    console.log(`资源: ${entry.name}`);
    console.log(`传输大小: ${entry.transferSize}B`);
    console.log(`编码体积: ${entry.encodedBodySize}B`);
    console.log(`解码体积: ${entry.decodedBodySize}B`);
    
    if (entry.transferSize === 0 && entry.encodedBodySize > 0) {
      console.log('状态: ✅ 强缓存命中');
    } else if (entry.transferSize > 0 && entry.transferSize < entry.encodedBodySize) {
      console.log('状态: 🔄 协商缓存命中');
    } else {
      console.log('状态: ⬇️ 新资源下载');
    }
  });
}

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。