Google chrome extension 跨浏览器扩展存储:chrome.storage或browser.storage还是?

Google chrome extension 跨浏览器扩展存储:chrome.storage或browser.storage还是?,google-chrome-extension,firefox-addon,storage,Google Chrome Extension,Firefox Addon,Storage,我有一个在Chrome中工作的扩展,它使用Chrome.storage.local.set和.get。就如何将存储代码移植到Firefox而言,我很难理解WebExtensionsAPI文档 引用的一些示例代码使用了browser.storage.local.set和.get,但当我在Chrome中运行的扩展中使用它们时,这些行返回“browser未定义”。WebExtensionsAPI移植文档建议chrome.storage.local.set和.get应该在Firefox和Safari中工

我有一个在Chrome中工作的扩展,它使用Chrome.storage.local.set和.get。就如何将存储代码移植到Firefox而言,我很难理解WebExtensionsAPI文档

引用的一些示例代码使用了browser.storage.local.set和.get,但当我在Chrome中运行的扩展中使用它们时,这些行返回“browser未定义”。WebExtensionsAPI移植文档建议chrome.storage.local.set和.get应该在Firefox和Safari中工作,但是,也许我读错了


我还没有尝试chrome.storage.set和.get进入Firefox扩展。它们应该工作吗?

chrome.storage.set
chrome.storage.get
将在Firefox扩展中工作,但最好使用API

以下是使用示例:

与chrome的不同之处在于它是一个承诺的基于API的应用程序

对于Safari,您可以查看API

此外,您可以始终在BG页面或内容脚本上使用
cookies
localStorage

在Chrome中,JavaScript API是在Chrome名称空间下访问的。在Firefox和Edge中,它们是在浏览器名称空间下访问的


因此,就您的情况而言,听起来您必须将所有chrome.which更改为浏览器。which

事实上,名称空间是不同的。所以不,浏览器不能在Chrome上工作。我想您可以在背景/内容代码的开头添加一行,如下所示:

var browser = (window.browser)? window.browser : window.chrome;
这样,您就可以使用来自Chrome和Firefox扩展的“浏览器”。但仍然存在一个问题。也许您已经注意到API中存在一些差异,例如Chrome在某些消息中使用回调,而Firefox使用承诺

因此,我建议您使用webextension polyfill库,这将允许您在任何浏览器中使用“browser”对象和Promises

如果您使用的是npm,则可以通过以下方式导入生产版本:

"webextension-polyfill": "^0.2.1"
之后,您应该在执行任何其他操作之前导入库:

  "background": {
    "scripts": [
      "node_modules/webextension-polyfill/dist/browser-polyfill.js",
      "background/your-code-goes-here.js"
    ]
  },

  "content_scripts": [{
      "matches": ["*://*/*"],
      "js": [
        "node_modules/webextension-polyfill/dist/browser-polyfill.js",
        "content/your-code-goes-here.js"
      ]
    }
如果您使用的是iframe,那么也应该从那里导入它。例如

<script src="../node_modules/webextension-polyfill/dist/browser-polyfill.js"></script>


希望有帮助。

chrome
将在FF中工作,但在Edge中不起作用。至于Safari,它根本不支持WebExtensions。关于这一点有两个问题:1)为什么您链接到的存储API是“更好的”/什么是“基于承诺的”API?2)该示例使用的“browser.storage.local.set/.get”代码在Chrome中不起作用,如问题所示-是因为我需要在某个地方定义“browser”,还是,1)当前,Firefox
Chrome
browser
命名空间,但在将来,他们可以不推荐
chrome
支持,只支持
browser
。在上面的链接中,您还可以检查基于承诺的API和回调之间的差异。您可以获得更多关于如何将chrome扩展移植到Firefox的信息。2) 不幸的是,
浏览器
名称空间在Chrome中不受支持。因此,您只需要使用
chrome