前端缓存策略详解:从 localStorage 到 Service Worker
常见误区
很多开发者认为'浏览器会自动处理缓存',或者觉得'缓存就是 localStorage 嘛'。结果往往是网站加载慢、内存占用高,甚至因为禁用缓存导致带宽浪费。
前端缓存不是简单的存储键值对,而是一套完整的策略体系。我们需要根据数据性质和使用频率,选择合适的方案。
为什么要做缓存?
合理的缓存策略能带来直接收益:
- 性能提升:减少重复请求,显著加快页面加载速度。
- 用户体验:支持离线访问,减少等待时间。
- 成本节省:降低服务器流量消耗。
- 可靠性:网络波动时仍能正常展示内容。
避坑指南:常见的错误写法
直接操作 localStorage 而不加管理是新手常犯的错误。比如没有过期策略,导致脏数据永远存在;或者缓存键命名混乱,引发冲突。
// 错误示范:没有缓存失效策略
function getCachedData() {
const cachedData = localStorage.getItem('data');
// 永远使用缓存,不考虑过期
return cachedData ? JSON.parse(cachedData) : null;
}
// 错误示范:缓存键命名混乱
function cacheData(key, data) {
// 每次生成新键,导致缓存无法复用
localStorage.setItem(`cache_${key}_${Date.now()}`, JSON.stringify(data));
}
构建专业的缓存管理器
为了规范化管理,建议封装一个统一的缓存类。它需要处理过期时间、存储空间不足异常以及清理逻辑。
class CacheManager {
constructor() {
this.cachePrefix = 'app_cache_';
. = * * * ;
}
() {
;
}
() {
cacheItem = {
data,
: .() + expiry,
: .()
};
{
.(.(key), .(cacheItem));
} (error) {
.(, error);
.();
}
}
() {
cacheItem = .(.(key));
(!cacheItem) ;
{
parsedItem = .(cacheItem);
(.() > parsedItem.) {
.(key);
;
}
parsedItem.;
} (error) {
.(, error);
.(key);
;
}
}
() {
.(.(key));
}
() {
.().( {
(key.(.)) {
.(key);
}
});
}
() {
.().( {
(key.(.)) {
{
item = .(.(key));
(.() > item.) {
.(key);
}
} (error) {
.(key);
}
}
});
}
}

