尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

浏览器隐私模式也不怕:angular-localForage自动降级存储的容错原理

浏览器隐私模式也不怕:angular-localForage自动降级存储的容错原理 浏览器隐私模式也不怕angular-localForage自动降级存储的容错原理【免费下载链接】angular-localForageAngular service directive for https://github.com/mozilla/localForage (Offline storage, improved.)项目地址: https://gitcode.com/gh_mirrors/an/angular-localForage当用户开启浏览器隐私模式无痕模式时很多 Web 应用的前端本地存储会瞬间失灵数据写入报错、页面功能瘫痪。而angular-localForage——一个专为 AngularJS 打造的离线存储增强服务与指令——内置了一套自动降级的容错机制能在隐私模式下自动从 IndexedDB/WebSQL 切换到 localStorage让应用继续稳定运行。本文将以通俗易懂的方式为你拆解 angular-localForage 自动降级存储的容错原理并附上快速上手指南。一、隐私模式下为什么本地存储会突然罢工浏览器为 Web 应用提供了多种本地存储方案localForage 会根据浏览器能力按以下优先级自动选择最先进的可用方案优先级存储驱动特点1IndexedDB容量大、支持结构化数据现代主流浏览器首选2WebSQL基于 SQL 的异步存储部分移动端浏览器使用3localStorage兼容性最好、所有浏览器都支持容量约 5MB这套择优录取的策略在正常模式下非常高效但一旦进入隐私模式问题就出现了Firefox 隐私模式IndexedDB 写入会直接抛出InvalidStateError错误Safari 隐私模式IndexedDB / WebSQL 被禁用报错码为5SecurityError可用配额直接归零。如果应用不做任何处理前端存储就会全线瘫痪。这正是 angular-localForage 容错机制存在的意义。二、核心容错思路识别错误 → 切换驱动 → 重试操作angular-localForage 的降级容错并不复杂核心就三步识别隐私模式典型错误、把存储驱动切换为 localStorage、自动重试刚才失败的操作。第一步精准识别隐私模式错误在 src/angular-localForage.js 的onError方法中项目用一段巧妙的判断来识别隐私模式if (((angular.isObject(err) err.name InvalidStateError || err InvalidStateError) this.driver() asyncStorage) || (angular.isObject(err) err.code 5)) { // 命中隐私模式错误触发降级 }判断逻辑可以拆解为两条当前驱动是asyncStorageIndexedDB/WebSQL 层且错误是InvalidStateError——对应Firefox 隐私模式错误对象携带code 5——对应Safari 隐私模式SecurityError。只有命中这些可恢复的错误才会触发降级其他错误仍然按原样抛出避免掩盖真正的 bug。第二步切换驱动并自动重试识别出隐私模式错误后代码调用setDriver(localStorageWrapper)切换到 localStorage然后原封不动地重放刚才失败的方法调用self.setDriver(localStorageWrapper).then(function() { fct.apply(self, args).then(function(item) { deferred.resolve(item); }, function(data) { deferred.reject(data); }); }, function() { deferred.reject(err); });注意fct.apply(self, args)这一行——它把失败的方法如setItem连同原始参数重新执行一遍开发者无需写任何降级代码操作就原地复活了。整个过程对调用方完全透明Promise 依然正常 resolve/reject。setItem 路径上的容错对于setItem写操作源码在 src/angular-localForage.js 提供了另一个onError辅助函数挂在 Promise 链的.catch()上逻辑一致先判断错误类型再切换驱动重试最后把结果原样返回给业务层。三、降级之后的细节key 前缀兼容切换到 localStorage 后还有一个细节值得注意localStorage 的 key 是全局平铺的为避免与同域其他应用冲突angular-localForage 支持通过oldPrefix配置使用实例名.作为 key 前缀相关逻辑集中在 src/angular-localForage.js 的prefix()方法中便于老版本数据的平滑迁移。这意味着即使 IndexedDB 和 localStorage 混合使用你的数据也井井有条、互不干扰。四、除了隐私模式这套容错还能应对哪些场景自动降级机制不只服务隐私模式凡是命中上述两类错误的场景都会自动兜底磁盘配额耗尽IndexedDB 写入超限抛出的异常同样能触发降级浏览器安全策略收紧部分环境限制 IndexedDB 使用应用也能平滑过渡️企业浏览器 / 老版本内核WebSQL 支持不完整时直接落到 localStorage 保证可用性。一句话总结无论底层存储多娇气你的 AngularJS 应用都能找到最朴素的替代方案。五、快速上手3 步接入 angular-localForage如果你也想用上这套自带容错的离线存储跟着下面的步骤即可快速接入。第 1 步获取源码并引入依赖git clone https://gitcode.com/gh_mirrors/an/angular-localForage按顺序引入localforage.js与angular-localForage.js注意先后顺序script srcpath/to/localforage.js/script script srcpath/to/angular-localForage.js/script第 2 步声明模块依赖并配置在应用入口注入LocalForageModule并通过 Provider 做基础配置参考 example/js/app.jsangular.module(myApp, [LocalForageModule]) .config([$localForageProvider, function($localForageProvider) { $localForageProvider.config({ name: myApp // 数据库名称与 key 前缀 }); }]);第 3 步用服务或指令读写数据方式一使用 $localForage 服务全部基于 Promise 异步操作$localForage.setItem(myName, Olivier Combe).then(function() { return $localForage.getItem(myName); }).then(function(data) { console.log(读取结果:, data); });方式二使用 local-forage 指令实现表单输入的自动持久化input local-forage{key: autoStoredKey, scopeKey: myObj.myVar, defaultValue: 默认值} ng-modelmyObj.myVar placeholder自动存储完整可运行的示例在 example/ 目录核心实现与单元测试分别在 src/angular-localForage.js 和 tests/ 中你也可以参考 tests/functional.js 了解各类数据类型的存取行为。六、结语让存储自带保险丝隐私模式下的存储报错是每个前端开发者迟早都会踩的坑。angular-localForage 用一套轻巧的识别错误 → 切换驱动 → 重试操作机制为 AngularJS 应用加上了存储保险丝开发者不需要关心用户开没开无痕模式也不用写一堆 try/catch 兜底数据总能被安全地存下来。如果你的项目还在用 AngularJS 做离线数据缓存不妨试试这个自带自动降级能力的方案让本地存储真正做到风雨无阻。【免费下载链接】angular-localForageAngular service directive for https://github.com/mozilla/localForage (Offline storage, improved.)项目地址: https://gitcode.com/gh_mirrors/an/angular-localForage创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表