网页也能存数据、能离线吗
很多人以为网页必须联网、刷新就丢光。其实现代浏览器给了前端一整套本地存储能力:小到记住用户的主题偏好,大到离线缓存整份待办数据、弱网下先渲染界面再慢慢同步。用得好,网页在地铁里没信号时也能打开、能操作,联网后再把数据同步上去。
这篇把前端存储的几兄弟按用途理清楚,并讲怎么用 IndexedDB 存数据、用 Cache API 加 Service Worker 让页面离线可用。
- 存储选型Cookie/LocalStorage/IndexedDB 各有边界。
- IndexedDB浏览器里的大容量异步数据库。
- Cache API缓存请求与响应,配合离线。
- Service Worker拦截网络请求,实现离线兜底。
几种存储该怎么选
浏览器里的本地存储各有分工:Cookie很小、每次请求都带在头上,主要用来做登录态,不适合存业务数据;LocalStorage是同步的键值对,适合存几 KB 的小偏好,但存大了会卡主线程、也不能存结构化数据;IndexedDB是浏览器内置的异步数据库,容量大、能存对象和索引,适合大量结构化数据。一句话:小偏好用 LocalStorage,真要存数据就上 IndexedDB。
LocalStorage:最简单的键值存储
LocalStorage 用法最直接,读写都是同步的,关掉页面数据还在。适合记住主题、折叠状态这类小开关。注意它只能存字符串,存对象要自己 JSON 序列化;而且同步读写,别往里塞大东西。
localStorage.setItem('theme', 'deepblue');
const t = localStorage.getItem('theme');
localStorage.removeItem('theme');
IndexedDB:存大量结构化数据
IndexedDB 是前端的"真数据库":异步、容量大、支持对象存储和索引。原生 API 偏底层,可以用 idb 这类小库包一层。核心概念:打开数据库、建对象仓库(类似表)、用增删改查事务操作。离线待办、离线缓存的聊天记录都适合放这。
import { openDB } from 'idb';
const db = await openDB('myapp', 1, {
upgrade(d) { d.createObjectStore('todos', { keyPath: 'id' }); }
});
await db.put('todos', { id: 1, text: '离线写一条' });
const row = await db.get('todos', 1);
Cache API 与 Service Worker
要让网页本身离线也能打开,光有数据存储不够,还得缓存页面资源。Cache API 可以把 Request 对应的 Response(HTML、JS、CSS、图片)整份存下来;Service Worker 是一个脱离页面的后台线程,能拦截页面发出的网络请求,离线时直接从 Cache 里把资源还回来。两者配合,就是 PWA 离线能力的核心。
// Service Worker 安装时预缓存核心资源
self.addEventListener('install', (e) => {
e.waitUntil(caches.open('v1').then((c) =>
c.addAll(['/', '/app.js', '/style.css'])));
});
// 离线时回退到缓存
self.addEventListener('fetch', (e) => {
e.respondWith(caches.match(e.request)
.then((r) => r || fetch(e.request)));
});
离线优先策略
常用的缓存策略有几种:缓存优先(先读缓存,离线也能用,适合静态壳);网络优先(有网就拿最新,失败再读缓存,适合要实时的内容); stale-while-revalidate(先用缓存快速显示,后台悄悄更新缓存)。按资源类型选对策略,才能既快又能离线。数据层面则用"先写本地、联网再同步"的离线优先思路,避免弱网下白屏。
实战清单
落地清单:
- 小偏好存 LocalStorage,大量结构化数据用 IndexedDB。
- IndexedDB 用 idb 等库包一层,别直接写原生底层 API。
- 页面资源离线靠 Cache API 加 Service Worker 配合。
- 按资源选缓存策略:静态壳缓存优先,实时内容网络优先。
- 弱网/离线用"先写本地、联网再同步",别白屏卡死。
- 注意存储容量与清理,缓存版本号升级时及时清理旧缓存。
Web 存储与离线能力,让网页从"必须联网"进化成"能独立工作"。把 LocalStorage、IndexedDB、Cache API、Service Worker 这套组合用好,弱网和无网环境下用户也能顺畅地打开、操作、甚至写作,这正是现代 Web 应用体验的重要一环。