localStorage
是…
- 好的!这是一个非常容易使用的 API。
localStorage.setItem('name', 'Chris'); let name = localStorage.getItem('name');
localStorage
是一个同步 API,它会阻塞主线程,并且每次访问它时,您都可能阻止页面交互。
Chrome 有一个想法(这是提案)来重新设计它。 最终,API 甚至更简单
import { storage } from 'std:kv-storage';
storage.set('name', 'Chris');
storage.get('name');
但是!它是异步的,所以我可以使用 await
在我执行这些操作之前而不阻塞任何内容。 此演示现在将在 Chrome Canary 中运行
查看 Pen
eXadrq by Chris Coyier (@chriscoyier)
在 CodePen 上。
这行代码到底是怎么回事?
import { storage } from 'std:kv-storage';
他们称它为“内置模块”。换句话说,您可以导入的东西,但它不会发出网络请求,因为它内置在浏览器中。非常有趣的方法。
Philip 继续说道
不全局暴露内置模块有很多好处:它们不会给启动新的 JavaScript 运行时上下文(例如新标签页、工作线程或服务工作线程)增加任何开销,并且除非实际导入,否则它们不会消耗任何内存或 CPU。此外,它们不会冒与代码中定义的其他变量发生命名冲突的风险。
它建立在 indexedDB 之上,因此如果您在玩它并需要清除值或其他操作,您可以在那里进行操作(开发者工具 > 应用程序 > 存储 > IndexedDB)。看看它是否流行起来,以及新的 JavaScript 功能是否会作为内置模块发布,这将是一件很有趣的事情。我无法确定其他浏览器是否认为这是一个好主意。
所以 localStorage 不会发出网络请求……所以除非您的计算机非常慢,否则您甚至会注意到延迟吗?
而且由于 localStorage 成为问题的理由来自 2012 年,这里还有一些来自 2012 年的信息似乎反驳了它。想知道现在的基准测试会怎么说?
https://www.webdirections.org/blog/localstorage-perhaps-not-so-harmful/
它在 IOS 隐身模式下会如何表现?
(不要陷入与 LocalStorage 相同的陷阱:https://stackoverflow.com/questions/14555347/html5-localstorage-error-with-safari-quota-exceeded-err-dom-exception-22-an)
所以 localStorage 存在一个让我非常抓狂的大问题:很多很多开发人员在没有 try/catch 的情况下访问它。 这在很多地方都发生,通常也发生在框架和垫片中。 它需要停止。
我不知道这是否是 Firefox 的特例,但是如果尝试在不允许使用 cookie 的网站上访问 localStorage 或 indexedDB,Firefox 会出现安全错误。对于那些只将 cookie 域列入白名单并禁用其他域的超级注重安全的网站,这会破坏许多网站。大多数此类网站根本无法呈现,因为安全错误会中断其他重要组件的加载。
道德:永远不要在没有 try/catch 的情况下尝试访问 localStorage、sessionStorage 或 indexedDB。这同样适用于将来可能出现的任何进步。始终包装。
在 Canary 中也不起作用
错误
混合内容:‘https://css-tricks.org.cn/’ 上的页面通过 HTTPS 加载,但请求了不安全的脚本‘std:kv-storage’。此请求已被阻止;内容必须通过 HTTPS 提供。
如何解决这个问题?