2022-09-01 12:08:40
前端缓存JS文件可通过服务器端缓存和浏览器端缓存实现,核心方法包括设置HTTP缓存头、使用CDN、利用localStorage/sessionStorage或Service Worker,并结合版本控制、压缩文件等最佳实践优化缓存效果。
一、服务器端缓存设置HTTP缓存头通过Cache-Control和Expires头控制缓存行为:
Cache-Control: max-age=31536000:设置文件缓存有效期为1年(适合不常变更的JS文件)。
Expires: Thu, 31 Dec 2025 23:59:59 GMT:指定文件过期时间(需注意与Cache-Control的优先级关系)。
结合ETag或Last-Modified头实现协商缓存,当文件内容变化时服务器返回新版本。
使用CDN(内容分发网络)CDN将JS文件分发至全球边缘节点,用户从最近节点获取文件,减少延迟:
适合高频访问的静态资源(如库文件jquery.min.js)。
需配置CDN的缓存策略(如缓存时间、回源规则)。
localStorage与sessionStorage
localStorage:持久化存储,关闭浏览器后仍存在,适合长期缓存不敏感的JS文件(需手动管理存储空间)。
sessionStorage:仅当前会话有效,关闭标签页后清除,适合临时缓存。
限制:存储大小为5MB左右,且需处理兼容性(如IE7以下不支持)。
示例:通过localStorage.setItem('script_v1', jsContent)存储文件内容,加载时检查是否存在。
Service Worker拦截网络请求并实现离线缓存:
注册Service Worker:在主线程中通过navigator.serviceWorker.register('/sw.js')注册。
缓存策略:在sw.js中定义fetch事件,优先返回缓存或更新缓存:const CACHE_NAME = 'js-cache-v1';self.addEventListener('fetch', (event) => { event.respondWith( caches.match(event.request).then((response) => { return response || fetch(event.request).then((networkResponse) => { caches.open(CACHE_NAME).then((cache) => { cache.put(event.request, networkResponse.clone()); }); return networkResponse; }); }) );});
更新机制:通过版本号(如CACHE_NAME)控制缓存更新,用户访问新版本时Service Worker自动安装。
设置合理的缓存时间
静态库(如React、Vue)可设置长期缓存(max-age=31536000)。
业务JS文件根据更新频率设置较短时间(如max-age=86400,即1天)。
使用版本控制
文件名哈希:通过构建工具(如Webpack)生成带哈希的文件名(如main.a1b2c3.js),文件内容变化时哈希值改变,触发浏览器重新下载。
查询参数:在URL中添加版本号(如main.js?v=2),但不如文件名哈希可靠(可能被缓存忽略)。
压缩JS文件
GZIP/Brotli压缩:服务器配置压缩算法,减少传输体积(通常可压缩60%-70%)。
代码分割:通过Webpack的SplitChunksPlugin将代码拆分为按需加载的模块,减少初始加载体积。
通过综合运用上述方法,可显著提升JS文件的加载效率,优化页面性能和用户体验。