前端 IndexDB 使用指南

目录

IndexedDB 一句话理解

📊 对比 localStorage

🎯 使用场景(什么时候用?)

💡 使用示例

⚠️ 注意事项

IDB 完整使用指南

1. 安装与基础操作

安装

四个核心方法

2. 完整工具类封装

3. React 组件中使用

4. 关键概念说明

📌 必知要点

5. 官方资源

6. 故障排除


IndexedDB 一句话理解

浏览器里的大容量本地数据库,比 localStorage 能存更多、更复杂的数据。

📊 对比 localStorage

特性localStorageIndexedDB
容量5MB至少250MB,甚至GB级
数据类型字符串任何JS对象、文件、二进制
查询方式键值对键值、索引、范围查询
速度同步(阻塞)异步(不阻塞页面)

🎯 使用场景(什么时候用?)

用 localStorage:

  • 存 token、用户设置等小数据
  • 简单键值对,数据量 < 5MB

用 IndexedDB:

  • 离线应用的全部数据
  • 用户生成的内容(图片、笔记)
  • 应用缓存(大量API数据)
  • 编辑器草稿自动保存

💡 使用示例

// 存文件/图片 await db.put('files', { id: 'photo1', name: '头像.jpg', data: fileBlob, // 二进制文件 size: '2MB' }); // 复杂查询(localStorage做不到) const expensiveProducts = await db .getAllFromIndex('products', 'price', IDBKeyRange.lowerBound(1000));

⚠️ 注意事项

不要用 IndexedDB 存:

  • 密码等敏感信息(不安全)
  • 实时同步数据(用 WebSocket)
  • 服务器端数据(用API)

应该用 IndexedDB 存:

  • 离线可用的用户数据
  • 大型应用的本地缓存
  • 用户上传的文件本地副本

一句话总结:需要存大量复杂数据且支持离线访问时,用 IndexedDB。

IDB 完整使用指南

1. 安装与基础操作

安装

yarn add idb

四个核心方法

import { openDB } from 'idb'; // 1. 打开/创建数据库(首次运行时会自动创建) const db = await openDB('MyAppDB', 1, { // 参数:数据库名,版本号 upgrade(db) { // 只在版本更新或初次创建时执行 // 创建对象仓库(相当于数据库表) db.createObjectStore('tasks', { keyPath: 'id' // 指定主键为 id 字段 }); } }); // 2. 添加或更新数据 await db.put('tasks', { id: 1, // 必须有 id 字段,作为主键 title: '学习 IDB', completed: false }); // 3. 查询所有数据 const allTasks = await db.getAll('tasks'); // 4. 根据 id 查询单条 const task = await db.get('tasks', 1); // 5. 根据 id 删除 await db.delete('tasks', 1);

2. 完整工具类封装

import { openDB } from 'idb'; class TaskDB { constructor() { this.dbName = 'TaskDatabase'; this.storeName = 'tasks'; this.version = 1; } // 初始化数据库连接 async connect() { return openDB(this.dbName, this.version, { upgrade(db) { // 如果 tasks 表不存在就创建 if (!db.objectStoreNames.contains('tasks')) { db.createObjectStore('tasks', { keyPath: 'id' // 主键字段 }); } } }); } // 增/改:保存任务 async saveTask(task) { const db = await this.connect(); // put 方法:id 存在则更新,不存在则新增 return db.put(this.storeName, task); } // 删:删除任务 async deleteTask(id) { const db = await this.connect(); return db.delete(this.storeName, id); } // 查:获取所有任务 async getAllTasks() { const db = await this.connect(); return db.getAll(this.storeName); } // 查:根据 id 获取单个任务 async getTask(id) { const db = await this.connect(); return db.get(this.storeName, id); } } export default new TaskDB(); // 导出单例实例

3. React 组件中使用

import React, { useState, useEffect } from 'react'; import taskDB from './taskDB'; // 导入上面封装的数据库工具 function TaskManager() { const [tasks, setTasks] = useState([]); const [newTaskTitle, setNewTaskTitle] = useState(''); // 组件加载时从数据库读取所有任务 useEffect(() => { loadTasks(); }, []); // 从数据库加载任务 const loadTasks = async () => { const savedTasks = await taskDB.getAllTasks(); setTasks(savedTasks || []); // 处理空数据情况 }; // 添加新任务 const handleAddTask = async () => { if (!newTaskTitle.trim()) return; const newTask = { id: Date.now(), // 使用时间戳作为唯一 ID title: newTaskTitle, completed: false, createdAt: new Date().toISOString() }; // 1. 保存到数据库 await taskDB.saveTask(newTask); // 2. 更新界面状态 setTasks([...tasks, newTask]); setNewTaskTitle(''); }; // 切换任务完成状态 const handleToggleTask = async (task) => { const updatedTask = { ...task, completed: !task.completed }; // 1. 更新数据库 await taskDB.saveTask(updatedTask); // 2. 更新界面状态 setTasks(tasks.map(t => t.id === task.id ? updatedTask : t )); }; // 删除任务 const handleDeleteTask = async (taskId) => { // 1. 从数据库删除 await taskDB.deleteTask(taskId); // 2. 从界面状态删除 setTasks(tasks.filter(task => task.id !== taskId)); }; return ( <div className="task-manager"> <h1>任务管理器</h1> {/* 添加任务表单 */} <div className="add-task"> <input type="text" value={newTaskTitle} onChange={(e) => setNewTaskTitle(e.target.value)} placeholder="输入新任务..." /> <button onClick={handleAddTask}>添加</button> </div> {/* 任务列表 */} <ul className="task-list"> {tasks.map(task => ( <li key={task.id} className={task.completed ? 'completed' : ''}> <input type="checkbox" checked={task.completed} onChange={() => handleToggleTask(task)} /> <span>{task.title}</span> <button onClick={() => handleDeleteTask(task.id)} className="delete-btn" > 删除 </button> </li> ))} </ul> {/* 统计信息 */} <div className="stats"> 总计: {tasks.length} 个任务 | 已完成: {tasks.filter(t => t.completed).length} | 未完成: {tasks.filter(t => !t.completed).length} </div> </div> ); } export default TaskManager;

4. 关键概念说明

📌 必知要点

  1. keyPath: 'id':指定数据的主键字段,每条数据必须有唯一的 id
  2. put() vs add()
    • put():id 存在则更新,不存在则新增
    • add():只能新增,id 重复会报错
  3. 版本控制:修改数据库结构时需增加版本号
// 版本升级示例 openDB('MyDB', 2, { // 版本从 1 升到 2 upgrade(db, oldVersion) { if (oldVersion < 1) { // 初始创建 db.createObjectStore('tasks', { keyPath: 'id' }); } if (oldVersion < 2) { // 新增索引(可按标题搜索) const store = db.transaction.objectStore('tasks'); store.createIndex('title', 'title'); } } });

5. 官方资源

6. 故障排除

// 1. 确保所有操作都是异步的 try { const db = await openDB(...); await db.put(...); } catch (error) { console.error('数据库错误:', error); } // 2. 检查浏览器兼容性 if (!window.indexedDB) { alert('您的浏览器不支持 IndexedDB'); } // 3. 清除缓存(开发时有用) indexedDB.deleteDatabase('MyAppDB');

💡 一句话总结openDB 打开数据库,put 保存数据,get 查询数据,delete 删除数据,所有操作都要加 await

Read more

[前后端系统开发教程]第四节-前端多平台部署的终极解决方案

[前后端系统开发教程]第四节-前端多平台部署的终极解决方案

在上一节中我们已经制作了一个简单的用户管理后端系统,我们这节就来尝试制作一个对应的前端系统。那么,我们是要使用安卓开发者工具制作一个安卓app,或者部署为微信小程序,亦或部署为传统的html网页? 答案是我全都要!通过DCloud生态,我们可以实现一份代码,多端部署。 第一部分:什么是DCloud生态? 众将士多端露难色,新面孔竟生好胆识 注:本节开始,教程的节奏会适当加快,希望各位可以跟上。 简单来说,DCloud生态的核心功能是,通过将项目按照不同的目标部署平台,二次编译为对应平台的代码,以实现“一份代码,多端部署”,以提高开发效率。详细介绍请参考uniapp官方文档:简介 - HBuilderX 文档。DCloud还提供云函数、云对象等工具,我们将在教程的后面去学习。 在这节教程中我们先学习如何在HBuilderX中调用上节中后端系统的API(即后端服务接口),编写一份前端代码,再将其打包为微信小程序、html网页和安卓app。 第二部分:怎么调用后端API接口? 接口表叫那前端瞧,服务器知晓谁来还 我们先回顾一下上节教程中的接口类,将其整理为一份API接口说明

vLLM+Open-WebUI部署通义千问2.5-7B完整教程

vLLM + Open-WebUI 部署通义千问2.5-7B完整教程 1. 引言 1.1 学习目标 本文将详细介绍如何使用 vLLM 和 Open-WebUI 联合部署阿里云发布的开源大模型——通义千问2.5-7B-Instruct。通过本教程,你将掌握: * 如何在本地或服务器环境中部署 Qwen2.5-7B 模型 * 利用 vLLM 实现高性能推理(支持 Tensor Parallelism、PagedAttention) * 使用 Open-WebUI 提供类 ChatGPT 的可视化交互界面 * 完整的环境配置、服务启动与访问流程 * 常见问题排查与性能优化建议 最终实现:通过浏览器访问 http://localhost:7860,即可与通义千问进行流畅对话。 1.2 前置知识 为顺利执行本教程,请确保具备以下基础: * 熟悉 Linux

【DataX篇】DataX的两种部署方式以及DataX-Web可视化管理平台的搭建

【DataX篇】DataX的两种部署方式以及DataX-Web可视化管理平台的搭建

💫《博主主页》: 🔎 ZEEKLOG主页:奈斯DB 🔎 IF Club社区主页:奈斯、 🔎 微信公众号:奈斯DB 🔥《擅长领域》: 🗃️ 数据库:阿里云AnalyticDB(云原生分布式数据仓库)、Oracle、MySQL、SQLserver、NoSQL(Redis) 🛠️ 运维平台与工具:Prometheus监控、DataX离线异构同步工具 💖如果觉得文章对你有所帮助,欢迎点赞收藏加关注💖     这篇文章将系统的分享 DataX 的安装部署实践,详细拆解DataX的两种核心部署方式——二进制部署与源码编译部署,并深入探讨动态参数配置、并发度优化等关键调优技巧。🎯     在此基础上,也将进一步介绍如何集成 DataX-Web可视化管控平台 ,以构建一个具备 统一调度、实时监控与高效管理 能力的企业级数据同步运维体系。🚀     DataX二进制、源码安装部署的 Github 地址: https://github.com/alibaba/DataX/blob/master/userGuid.md     DataX-Web二进制、

百川2-13B-Chat WebUI v1.0 应用场景全解析:企业知识问答、编程辅导、多轮客服助手落地案例

百川2-13B-Chat WebUI v1.0 应用场景全解析:企业知识问答、编程辅导、多轮客服助手落地案例 1. 引言:当大模型走进企业,它能做什么? 如果你是一家公司的技术负责人,最近是不是经常听到同事讨论大模型?大家可能都在问:这东西到底能干什么?是只能聊聊天,还是真能帮我们解决实际问题? 今天,我们就来聊聊百川2-13B-Chat WebUI v1.0在实际工作中的应用。这不是一个简单的聊天机器人,而是一个经过4bit量化、显存占用仅10GB左右、能在消费级GPU上流畅运行的智能助手。更重要的是,它支持商用申请,这意味着你可以放心地把它用在企业环境中。 在过去几个月里,我们团队把这个模型部署在了多个实际场景中,从内部知识库问答到编程辅导,再到多轮客服对话。我发现,很多企业其实已经具备了使用这类工具的条件,只是不知道从哪里开始,或者担心效果不好。 这篇文章,我就来分享三个真实的落地案例,告诉你这个模型在实际工作中到底能发挥多大作用,以及具体怎么用。无论你是想提升团队效率,还是想探索AI在企业中的应用,相信都能从中获得启发。 2. 案例一:企业知识问答系统,让信息查