当页面刷新时,JS请求哪些地方有缓存处理?

186 阅读3分钟

页面刷新时,JS请求哪些地方有缓存处理?

在 Web 开发中,缓存机制是提升应用性能的重要手段。页面刷新时,JavaScript 发起的请求可能会涉及多个缓存处理策略。以下是主要的缓存处理方式:

1. 浏览器缓存

浏览器缓存是指浏览器保存已请求的资源,以便在下次请求时直接从缓存中读取,而不是向服务器发送请求。主要包括:

  • 强缓存:通过 HTTP 头部的 Cache-ControlExpires 控制。若缓存未过期,浏览器会直接使用缓存,不会发送请求。

    Cache-Control: max-age=3600
    Expires: Wed, 21 Oct 2025 07:28:00 GMT
    
  • 协商缓存:当强缓存过期后,浏览器会向服务器发送请求,通过 If-None-MatchIf-Modified-Since 等头部进行验证。若资源未变化,服务器返回 304 状态码,浏览器继续使用缓存。

    If-None-Match: "etag_value"
    If-Modified-Since: Wed, 21 Oct 2025 07:28:00 GMT
    

2. Service Worker 缓存

Service Worker 是一个强大的工具,它允许开发者拦截网络请求并返回缓存的响应。通过 Cache API,开发者可以手动管理缓存的内容。

  • 安装阶段:在 Service Worker 安装时,可以预缓存需要的资源。

    self.addEventListener('install', event => {
      event.waitUntil(
        caches.open('my-cache').then(cache => {
          return cache.addAll([
            '/index.html',
            '/script.js',
            '/style.css'
          ]);
        })
      );
    });
    
  • 请求拦截:在 fetch 事件中,开发者可以决定是从缓存中返回还是从网络获取。

    self.addEventListener('fetch', event => {
      event.respondWith(
        caches.match(event.request).then(response => {
          return response || fetch(event.request);
        })
      );
    });
    

3. AJAX 请求的缓存控制

对于 AJAX 请求,开发者可以通过设置请求头来控制缓存行为:

  • 禁用缓存:可以在请求中设置 Cache-Control: no-cachePragma: no-cache,强制浏览器每次都向服务器请求最新数据。

    fetch('/api/data', {
      method: 'GET',
      headers: {
        'Cache-Control': 'no-cache',
        'Pragma': 'no-cache'
      }
    });
    
  • 利用缓存:如果希望利用浏览器的缓存,可以不设置任何缓存相关的请求头,浏览器会根据服务器的 Cache-Control 等信息决定是否缓存。

4. CDN 缓存

当使用 CDNs(内容分发网络)时,资源可能会被缓存在 CDN 节点上。CDN 会根据设置的缓存策略(如 Cache-ControlEdge-Control 等)来缓存静态资源。

  • 缓存策略:CDN 可以配置缓存时间,若资源未变更,CDN 将直接从缓存中提供资源,减少服务器负荷。

5. IndexedDB 和 LocalStorage

JavaScript 还可以使用浏览器的存储机制,如 IndexedDB 和 LocalStorage,来缓存数据。

  • IndexedDB:用于存储结构化数据,支持事务。适用于需要存储大量数据的场景。

    const dbRequest = indexedDB.open('myDatabase', 1);
    dbRequest.onsuccess = function(event) {
      const db = event.target.result;
      const transaction = db.transaction(['myStore'], 'readwrite');
      const store = transaction.objectStore('myStore');
      store.put({ id: 1, value: 'some data' });
    };
    
  • LocalStorage:适合存储少量简单数据,数据是以键值对的形式存在。

    localStorage.setItem('key', 'value');
    const value = localStorage.getItem('key');
    

6. HTTP/2 和推送缓存

使用 HTTP/2 协议时,服务器可以主动推送资源到客户端缓存。虽然这不是传统的请求缓存,但它能有效减少页面加载时间。

结论

当页面刷新时,JavaScript 请求的缓存处理涉及多个方面,包括浏览器缓存、Service Worker 缓存、AJAX 请求的缓存控制、CDN 缓存、IndexedDB 和 LocalStorage 以及 HTTP/2 推送缓存。理解这些缓存机制可以帮助开发者优化应用性能,提高用户体验。