页面刷新时,JS请求哪些地方有缓存处理?
在 Web 开发中,缓存机制是提升应用性能的重要手段。页面刷新时,JavaScript 发起的请求可能会涉及多个缓存处理策略。以下是主要的缓存处理方式:
1. 浏览器缓存
浏览器缓存是指浏览器保存已请求的资源,以便在下次请求时直接从缓存中读取,而不是向服务器发送请求。主要包括:
-
强缓存:通过 HTTP 头部的
Cache-Control和Expires控制。若缓存未过期,浏览器会直接使用缓存,不会发送请求。Cache-Control: max-age=3600 Expires: Wed, 21 Oct 2025 07:28:00 GMT -
协商缓存:当强缓存过期后,浏览器会向服务器发送请求,通过
If-None-Match和If-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-cache或Pragma: no-cache,强制浏览器每次都向服务器请求最新数据。fetch('/api/data', { method: 'GET', headers: { 'Cache-Control': 'no-cache', 'Pragma': 'no-cache' } }); -
利用缓存:如果希望利用浏览器的缓存,可以不设置任何缓存相关的请求头,浏览器会根据服务器的 Cache-Control 等信息决定是否缓存。
4. CDN 缓存
当使用 CDNs(内容分发网络)时,资源可能会被缓存在 CDN 节点上。CDN 会根据设置的缓存策略(如 Cache-Control、Edge-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 推送缓存。理解这些缓存机制可以帮助开发者优化应用性能,提高用户体验。