我正在开发Chrome扩展程序,我需要存储一些数据,然后在某些时候获取它。我对可用 storage
进行了调查,并发现了以下问题:window.localStorage
和chrome.storage.local
。
所以我的问题是,哪一个是在Chrome扩展程序中使用的正确选择:
window.localStorage
或 chrome.storage.local
?
P.S。我正在使用browser action
加载HTML
中的本地IFRAME
。所以我没有使用popup.js
。
答案 0 :(得分:54)
localStorage
<强>优点:强>
var value = localStorage[key]
<强>缺点:强>
JSON.stringify
chrome.storage.local
<强>优点:强>
chrome.storage.onChanged
"unlimitedStorage"
权限,可以保留任意数量的大量数据。有一个很好的内置默认值机制:
chrome.storage.local.get({key: defaultValue}, function(value){/*...*/});
<强>缺点:强>
异步,因此有点难以使用:
chrome.storage.local.get("key", function(value){/* Continue here */});
chrome.storage.local.get(null)
获取所有值或使用类似Storage Area Explorer的内容。chrome.storage.sync
与上述相同,但是:
<强>优点:强>
<强>缺点:强>
截至2016-11-06,Firefox WebExtensions 或Edge Extensions尚未支持,因此不可移植。
注意:storage.sync
现在是FF WebExtension compatible,但无法让Chrome和FF本地同步。
答案 1 :(得分:41)
这完全取决于Chrome扩展程序的功能。 window.localStorage是HTML5存储。除非您在后台页面中运行它,否则它只允许您将数据存储到特定域的存储中。对于注入DOM的代码也是如此,因为它将在网页上使用localStorage。
换句话说,您将无法在不同的网页之间共享数据,除非您在后台页面中使用localStorage,后台页面独立于网页运行,因为它具有chrome:// URI作为其域。
另一方面,chrome.storage.local专为Chrome扩展程序和Chrome应用程序而设计,可将数据存储在更集中的位置。由于普通网页无法访问,因此每个Extension都有自己的存储空间。一种可能性是您的后台页面处理设置和获取数据的处理,而您的内容脚本则处理修改和与网页交互的问题。
然而,这些API也在内容脚本中工作,我编写的两个扩展都使用从内容脚本调用的chrome.storage.local。
作为一个例子,我构建了一个Stack App,它在Stack Exchange中保留收件箱项,直到你实际读取它们为止,称为StackInbox。由于Stack Exchange站点跨越数百个域,因此我选择了chrome.storage.local,因为我可以保存用户的accountId并在所有站点中重复使用它,确保收件箱数据同步,同时也直接在内容脚本中使用它。
作为一个简单的测试,在localStorage中将一些数据放在一个域上,在内容脚本中,并尝试从另一个域中提取它,你会发现数据不会存在。使用chrome.storage.local,这不是问题。
最后,Chrome扩展程序和Chrome应用程序已列入白名单,因为用户选择安装它,因此他们通常可以做比普通网站更多的事情。例如,通过在清单中指定“unlimitedStorage”权限,您可以存储的数据远远超出HTML5 localStorage上的5MB限制。
有关详细信息,请参阅Google's documentation on Chrome Storage。