基于实际代码分析的SVT前端存储管理、测试工具和问题排查指南。
SVT-Web 实现了一套完整的存储管理系统,包括加密存储、状态持久化、测试工具和问题排查机制。系统支持 Zustand 状态管理的持久化存储,并提供调试工具便于开发和维护。
功能:测试 createEncryptedStorage() 的基本功能
用法:
testStorage()测试内容:
- ✅ 数据写入功能
- ✅ 数据读取功能
- ✅ 数据类型验证
- ✅ localStorage 原始数据检查
- ✅ 数据清理功能
示例输出:
=== 开始测试存储功能 ===
1. 测试写入数据...
数据类型: string
数据内容: {"state":{"test":"Hello World","timestamp":1751597790512},"version":0}
✓ 写入成功
2. 测试读取数据...
✓ 读取成功: {"state":{"test":"Hello World","timestamp":1751597790512},"version":0}
✓ 解析成功: Object { state: {…}, version: 0 }
✓ 数据验证通过
3. 检查localStorage内容...
原始数据: {"state":{"test":"Hello World","timestamp":1751597790512},"version":0}
4. 清理测试数据...
✓ 清理完成
=== 测试完成 ===
功能:测试 AuthStore 和 UserStore 的存储功能
用法:
testZustandStorage()测试内容:
- ✅ AuthStore 状态写入/读取
- ✅ UserStore 状态写入/读取
- ✅ 存储格式验证
- ✅ 数据完整性检查
功能:显示当前所有存储数据的详细信息
用法:
debugLocalStorage()输出信息:
🔍 LocalStorage Debug Report
======================
📊 存储统计:
- 总键数: 3
- 总大小: ~1.2KB
📝 详细内容:
┌─────────────────┬────────────────┬─────────────┐
│ 键名 │ 值类型 │ 大小 │
├─────────────────┼────────────────┼─────────────┤
│ auth-storage │ object │ 456B │
│ user-storage │ object │ 623B │
│ svt-tab-state │ array │ 234B │
└─────────────────┴────────────────┴─────────────┘
功能:清理所有 SVT 相关的存储数据
用法:
clearAllStorage()清理内容:
- Auth Store 数据
- User Store 数据
- Tab 状态数据
- 其他 SVT 相关数据
症状:
localStorage.getItem('auth-storage') // 返回 "[object Object]"
localStorage.getItem('user-storage') // 返回 "[object Object]"原因:
- Zustand persist 调用异步的 storage 方法导致的类型转换错误
- 数据没有被正确序列化为 JSON 字符串
解决方案:
// 1. 清理损坏的数据
clearAllStorage()
// 2. 刷新页面重新初始化存储
location.reload()
// 3. 验证修复结果
testZustandStorage()症状:
- 页面刷新后用户需要重新登录
- 控制台显示 "token not found" 错误
排查步骤:
// 1. 检查存储内容
console.log('auth-storage:', localStorage.getItem('auth-storage'));
// 2. 检查加密配置
console.log('AES Key:', !!import.meta.env.VITE_AES_KEY);
console.log('AES Enabled:', import.meta.env.VITE_AES_ENABLED);
// 3. 测试存储功能
testStorage()可能原因:
- 环境变量
VITE_AES_KEY配置错误 - localStorage 被浏览器清理
- 隐私模式或浏览器限制
解决方案:
// 1. 验证环境配置
if (!import.meta.env.VITE_AES_KEY) {
console.error('❌ VITE_AES_KEY 未配置');
}
// 2. 重新设置存储
clearAllStorage();
location.reload();
// 3. 测试存储可用性
if (!localStorage) {
console.error('❌ localStorage 不可用');
}症状:
- 页面刷新后 Tab 页面都消失
- 只显示默认首页 Tab
排查步骤:
// 1. 检查 Tab 存储
console.log('Tab State:', localStorage.getItem('svt-tab-state'));
console.log('Active Tab:', localStorage.getItem('svt-active-tab'));
// 2. 检查数据格式
try {
const tabs = JSON.parse(localStorage.getItem('svt-tab-state') || '[]');
console.log('Tab Data Valid:', Array.isArray(tabs));
} catch (e) {
console.error('❌ Tab 数据格式错误:', e);
}解决方案:
// 1. 清理损坏的 Tab 数据
localStorage.removeItem('svt-tab-state');
localStorage.removeItem('svt-active-tab');
// 2. 刷新页面重新初始化
location.reload();症状:
- 存储操作失败
- 控制台显示 "QuotaExceededError"
排查步骤:
// 1. 检查存储使用情况
function getStorageSize() {
let total = 0;
for (let key in localStorage) {
if (localStorage.hasOwnProperty(key)) {
total += localStorage[key].length + key.length;
}
}
return (total / 1024).toFixed(2) + ' KB';
}
console.log('存储使用量:', getStorageSize());
// 2. 检查 SVT 相关存储
debugLocalStorage()解决方案:
// 1. 清理不必要的数据
clearAllStorage();
// 2. 检查是否有大量冗余数据
// 优化存储的数据结构,只保存必要信息// 监听 localStorage 变化
const originalSetItem = localStorage.setItem;
localStorage.setItem = function(key, value) {
console.log(`🔄 localStorage.setItem: ${key}`, value);
originalSetItem.apply(this, arguments);
};
const originalRemoveItem = localStorage.removeItem;
localStorage.removeItem = function(key) {
console.log(`🗑️ localStorage.removeItem: ${key}`);
originalRemoveItem.apply(this, arguments);
};// 导出 SVT 相关存储数据
function exportSVTStorage() {
const data = {};
for (let key in localStorage) {
if (key.startsWith('svt-') || key.includes('auth') || key.includes('user')) {
data[key] = localStorage[key];
}
}
return JSON.stringify(data, null, 2);
}
// 导入存储数据
function importSVTStorage(jsonData) {
const data = JSON.parse(jsonData);
for (let key in data) {
localStorage.setItem(key, data[key]);
}
console.log('✅ 存储数据导入完成');
}// 监控存储操作性能
function measureStoragePerformance() {
const start = performance.now();
// 执行存储操作
testZustandStorage();
const end = performance.now();
console.log(`⏱️ 存储操作耗时: ${(end - start).toFixed(2)}ms`);
}# .env.development
VITE_AES_KEY=your_32_character_aes_key_here_now
VITE_AES_ENABLED=true
VITE_DEBUG_MODE=true
# .env.production
VITE_AES_KEY=production_32_char_secure_key_here
VITE_AES_ENABLED=true
VITE_DEBUG_MODE=false// 推荐的存储配置
const storageConfig = {
// 认证数据:高安全性,短期存储
auth: {
encrypt: true,
expire: '24h',
keys: ['token', 'expiryDate']
},
// 用户数据:中等安全性,长期存储
user: {
encrypt: true,
expire: '30d',
keys: ['userInfo', 'permissions']
},
// Tab 状态:低安全性,会话存储
tabs: {
encrypt: false,
expire: 'session',
keys: ['tabs', 'activeTab']
}
};// 健壮的存储操作
function safeStorageOperation(operation: () => void) {
try {
operation();
} catch (error) {
if (error.name === 'QuotaExceededError') {
console.warn('⚠️ 存储空间不足,尝试清理');
clearAllStorage();
} else if (error.name === 'SecurityError') {
console.warn('⚠️ 存储访问被拒绝(可能是隐私模式)');
} else {
console.error('❌ 存储操作失败:', error);
}
}
}- 浏览器是否支持 localStorage
- 是否在隐私/无痕模式下
- 环境变量是否正确配置
- 控制台是否有错误信息
- localStorage 中是否有相关数据
- 数据格式是否正确(非
[object Object]) - 数据是否被正确序列化
- 版本兼容性是否正常
- 登录状态是否持久化
- Tab 状态是否恢复
- 用户偏好是否保存
- 存储清理是否正常
- 存储操作是否流畅
- 是否有内存泄漏
- 数据大小是否合理
- 清理机制是否有效
- State-Management.md - Zustand 状态管理详解
- Component-Structure.md - 组件架构设计
- Tab-System-Design.md - Tab 系统设计
存储管理涉及用户敏感数据,请注意:
- 加密保护:敏感数据必须加密存储
- 定期清理:及时清理过期和无效数据
- 权限控制:限制存储访问权限
- 监控审计:记录存储操作日志
- 容量管理:监控存储使用量,防止超限