前端存储三剑客:localStorage、sessionStorage、cookie 超详细对比

前端存储三剑客:localStorage、sessionStorage、cookie 超详细对比

在前端开发中,数据本地存储是提升用户体验、优化性能、实现持久化状态的核心技术。我们最常用的就是 localStoragesessionStoragecookie 这三种方案,但很多开发者容易混淆它们的用法、存储特性和适用场景。

这篇博客就用最清晰、最实用的方式,一次性讲透三者的区别、用法和最佳实践。


一、先搞懂核心概念

  • cookie:最早的客户端存储方案,会随 HTTP 请求自动发送到服务器,主要用于身份验证、会话保持。
  • localStorage:HTML5 新增的本地存储,持久化存储,手动清除才会消失,不参与网络请求。
  • sessionStorage:HTML5 新增的会话存储,页面会话期间有效,关闭标签页 / 浏览器就清空。

二、核心区别一张表看懂

表格

特性localStoragesessionStoragecookie
生命周期永久有效,手动清除仅当前会话(关闭标签 / 浏览器失效)可设置过期时间,默认会话级
存储容量5MB5MB很小,仅 4KB
与服务端通信不参与不参与自动携带在 HTTP 请求头中
访问权限同源(协议 + 域名 + 端口)共享同源 + 同一标签页 共享同源共享
API 易用性简单,键值对 API简单,键值对 API原生 API 繁琐,需手动封装
安全性较高,不发往服务器较高,不发往服务器需配置 HttpOnly/Secure 防攻击
数据类型仅支持 字符串仅支持 字符串仅支持 字符串
一句话总结:存大量数据用 localStorage,临时会话用 sessionStorage,需要给服务器传的状态用 cookie。

三、基础用法速查(代码示例)

三者都是键值对存储,且只能存字符串,复杂对象需用 JSON 转换。

1. localStorage

javascript

运行

// 存 localStorage.setItem('username', '张三'); localStorage.setItem('userInfo', JSON.stringify({ age: 20 })); // 取 const name = localStorage.getItem('username'); const user = JSON.parse(localStorage.getItem('userInfo')); // 删单个 localStorage.removeItem('username'); // 清空全部 localStorage.clear(); 

2. sessionStorage

API 和 localStorage 完全一致,唯一区别是生命周期:

javascript

运行

sessionStorage.setItem('token', '临时令牌'); // 关闭页面立即消失 

3. cookie(原生写法)

原生 API 比较繁琐,推荐封装或用库:

javascript

运行

// 设置 cookie(带7天过期时间) document.cookie = "username=张三; max-age=" + 60*60*24*7; // 获取 cookie const cookie = document.cookie; // 删除 cookie(设置过期时间为过去) document.cookie = "username=; max-age=0"; 

四、关键差异深度解析

1. 生命周期(最重要)

  • localStorage:真正的持久化存储,重启浏览器、关机都不会丢。
  • sessionStorage临时存储,只要标签页一关,数据立刻清空。
  • cookie:灵活可控,可设置 max-age/expires 定义过期时间。

2. 存储容量

  • cookie:4KB —— 只能存少量文本(token、id)。
  • storage:5MB —— 可存大量前端数据(缓存列表、用户配置)。

3. 网络通信(核心区别)

  • cookie每次请求都会自动带到服务端,浪费流量,影响性能。
  • localStorage/sessionStorage不参与通信,纯前端本地使用。

4. 安全性

  • cookie:不配置 HttpOnly 时,JS 可读取,容易被 XSS 攻击;
  • storage:不会自动发送到服务器,相对更安全,但仍需防范 XSS。

五、实际开发怎么选?(最佳实践)

✅ 使用 localStorage 的场景

  • 长期保存用户偏好设置(主题、语言、列表布局)
  • 前端缓存大量数据(商品列表、搜索历史)
  • 不需要传给服务端的持久化状态

✅ 使用 sessionStorage 的场景

  • 表单临时数据(防止刷新丢失,关闭页面自动清空)
  • 单页应用路由状态、临时令牌
  • 同一页面会话内的临时数据
  • 登录态、身份认证 Token(必须让服务端识别)
  • 需要跨页面、跨浏览器持久化且传给后端的数据
  • 服务端需要读取的客户端状态

六、避坑小贴士

  1. 三者都只能存字符串,对象 / 数组必须用 JSON.stringify 存,JSON.parse 取。
  2. cookie 别存大量数据,会严重影响请求性能。
  3. sessionStorage 不跨标签页,打开新页面数据不共享。
  4. localStorage 永久存储,敏感信息不要存(密码、密钥)。
  5. 登录认证优先用 cookie + HttpOnly,安全性最高。

总结

  • localStorage:持久化、大容量、纯本地存储
  • sessionStorage:临时会话、大容量、页面关闭即清空
  • cookie:可过期、小容量、自动传服务端、用于登录认证

掌握这三种存储方案,你就能在前端开发中灵活处理数据持久化,写出更稳定、更高效的代码。


总结

  1. localStorage 适合长期本地缓存,容量大、不发服务器;
  2. sessionStorage 适合临时会话数据,关闭页面自动清空;
  3. cookie 适合需要传给服务端的状态(如登录),容量小、可设置过期。

Read more

Whisper语音识别避坑指南:从安装到部署常见问题全解

Whisper语音识别避坑指南:从安装到部署常见问题全解 你是不是也遇到过这样的情况:满怀期待地部署Whisper语音识别服务,结果卡在FFmpeg找不到、GPU显存爆了、端口被占用……别急,这篇文章就是为你准备的。我们不讲大道理,只聊实战中踩过的坑和对应的解决方案。 本文基于 Whisper-large-v3 多语言语音识别 Web 服务镜像(由113小贝构建),结合真实部署经验,手把手带你绕开那些让人抓狂的“小问题”。无论你是第一次接触语音识别,还是已经折腾了一整天却始终无法启动服务,这篇避坑指南都能帮你快速上路。 1. 环境准备:别让基础配置拖后腿 1.1 硬件要求不是“建议”,是底线 先说清楚:Whisper large-v3 模型对硬件有硬性要求,不是“推荐”那么简单。这个模型参数量高达1.5B,加载一次就要吃掉近3GB显存,推理过程还会持续占用资源。 资源最低要求推荐配置GPURTX 3090 (24GB)RTX 4090 D (23GB+)内存16GB32GB存储10GB可用空间SSD

InstructPix2Pix效果实测:结构保留能力 vs Stable Diffusion 图生图对比

InstructPix2Pix效果实测:结构保留能力 vs Stable Diffusion 图生图对比 1. 为什么说InstructPix2Pix是真正的“魔法修图师” 你有没有过这样的经历:想把一张照片里的白天改成夜晚,或者给朋友P一副墨镜,又或者让一张普通街景变成雨天氛围——但打开PS,面对层层叠叠的图层和蒙版,最后只留下满屏困惑?传统图像编辑工具需要你懂色彩曲线、图层混合模式、甚至手绘遮罩;而Stable Diffusion这类图生图模型,又常常让人陷入“写对Prompt像解谜”的困境:多加一个词,画面就崩掉;少写一个细节,AI就自由发挥到千里之外。 InstructPix2Pix不一样。它不把你当设计师,也不把你当咒语学徒,而是直接把你当“导演”——你只需要用日常英语说出想法,它就照着执行,而且几乎不会跑偏。 这不是滤镜,不是风格迁移,更不是粗暴重绘。它像一位经验丰富的修图老手,先仔仔细细看清原图里每一条轮廓线、每一个人物姿态、每一处光影关系,再只动你点名要改的那一小块。你让它“add sunglasses”,它不会顺手把人脸拉长、把背景重画一遍;你让它“

【AIGC】ChatGPT 实用技巧:文本与数据的结构化方法全解析

【AIGC】ChatGPT 实用技巧:文本与数据的结构化方法全解析

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]本文专栏: AIGC |ChatGPT 文章目录 * 💯前言 * 💯中文排版序号 * 1. 一级标题(First-Level Title) * 2. 二级标题(Second-Level Title) * 3. 三级标题(Third-Level Title) * 4. 四级标题(Fourth-Level Title) * 💯Markdown 语法 * 一级标题(First-Level Heading) * 二级标题(Second-Level Heading) * 子标题(Subheadings) * 列表(Lists) * 无序列表 * 有序列表 * 加粗和斜体(Bold and Italics) * 加粗 * 斜体 * 💯编程语法也是结构化 * YAML 语法结构的例子 * 1. 层级关系(

llama.cpp加载多模态gguf模型

llama.cpp预编译包还不支持cuda12.6 llama.cpp的编译,也有各种坑 llama.cpp.python的也需要编译 llama.cpp命令行加载多模态模型 llama-mtmd-cli -m Qwen2.5-VL-3B-Instruct-q8_0.gguf --mmproj Qwen2.5-VL-3B-Instruct-mmproj-f16.gguf -p "Describe this image." --image ./car-1.jpg **模型主gguf文件要和mmporj文件从一个库里下载,否则会有兼容问题,建议从ggml的官方库里下载 Multimodal GGUFs官方库 llama.cpp.python加载多模态模型 看官方文档 要使用LlamaChatHandler类,官方已经写好了不少多模态模型的加载类,比如qwen2.5vl的写法: from llama_cpp import Llama