chrome.storage

概述

这一 API 为扩展程序的存储需要而特别优化,它提供了与 localStorage API 相同的能力,但是具有如下几个重要的区别:

  1. * 用户数据可以通过 Chrome 浏览器的同步功能自动同步(使用 `storage.sync`)。
  2. * 您的扩展程序的内容脚本可以直接访问用户数据,而不需要后台页面。
  3. * 即使使用[分离式隐身行为](http://developer.chrome.com/extensions/manifest/incognito.html),用户的扩展程序设置也会保留。
  4. * 它是异步的,并且能够进行大量的读写操作,因此比阻塞和串行化的 `localStorage API` 更快。
  5. * 用户数据可以存储为对象(`localStorage API` 以字符串方式存储数据)。
  6. * 可以读取管理员为扩展程序配置的企业策略(使用 `storage.managed` [架构](http://developer.chrome.com/extensions/manifest/storage.html) )。

清单文件

您必须在扩展程序的清单文件中声明 “storage” 权限才能使用存储 API。例如:

manifest.json

  1. {
  2. "name": "我的扩展程序",
  3. ...
  4. "permissions": [
  5. "storage"
  6. ],
  7. ...
  8. }

用法

如果要为您的扩展程序储存用户数据,您可以使用 storage.sync 或 storage.local。使用 storage.sync 时,储存的数据将会自动在用户启用同步功能并已经登录的所有 Chrome 浏览器间同步。

当 Chrome 浏览器处于离线状态时,Chrome 浏览器将数据储存在本地。下一次浏览器在线时,Chrome 浏览器将会同步数据。即使用户关闭了同步,storage.sync 仍然有效,只是此时它与 storage.local 的行为相同。

不应该储存机密的用户信息!存储区没有加密。

storage.managed 存储区是只读的。

存储空间与调用频率限制

chrome.storage 并不像一辆大卡车那样,而是像一系列的管道,如果您不理解这一点的话,这样的管道很容易被填满。如果当您存入消息时它们填满了,它将会变成细线,任何人向其中存入大量数据都有可能使操作产生延迟。

有关目前对存储 API 的限制以及超出限制的结果,请参见 synclocal 的配额信息。

例子

以下例子检查用户在表单中保存的 CSS 代码,如果找到的话则存储下来。

  1. function saveChanges() {
  2. // 获取表单中保存的值。
  3. var theValue = textarea.value;
  4. // 确保包含代码。
  5. if (!theValue) {
  6. message('错误:没有指定值');
  7. return;
  8. }
  9. // 使用 Chrome 扩展程序的存储 API 保存它。
  10. chrome.storage.sync.set({'value': theValue}, function() {
  11. // 通知保存完成。
  12. message('设置已保存');
  13. });
  14. }

如果您希望追踪数据对象的更改,您可以向 onChanged 事件添加监听器,每当存储有任何更改时将会产生该事件。如下是监听对已保存内容的更改的示例代码:

  1. chrome.storage.onChanged.addListener(function(changes, namespace) {
  2. for (key in changes) {
  3. var storageChange = changes[key];
  4. console.log('存储键“%s”(位于“%s”命名空间中)已更改。' +
  5. '原来的值为“%s”,新的值为“%s”。',
  6. key,
  7. namespace,
  8. storageChange.oldValue,
  9. storageChange.newValue);
  10. }
  11. });

具体属性和事件函数

参考 https://developer.chrome.com/extensions/storage.html