在 ManifestV3 Service Worker 后台脚本中使用“window”全局变量

Gan*_*ula 2 firefox-addon google-chrome-extension firefox-addon-webextensions web-extension

我正在开发一个 Manifest v3 浏览器扩展,我需要从后台脚本识别当前正在运行该扩展的浏览器。由于 ManifestV3 扩展使用 Service Worker,因此它没有 DOM 或window. 所以我无法使用window.navigator.userAgent.

我发现一个相关的问题讨论如何获取窗口高度和宽度信息,但我找不到任何其他信息来获取浏览器的 userAgent。

这可能吗?

wOx*_*xOm 6

中性全局变量

诸如此类的事情navigator并不特定于窗口的视觉表示。
省略window.直接阅读即可:

  • navigator
  • navigator.userAgent
  • atob
  • fetch

特定于窗口的全局变量

特定于用户交互或视觉/听觉表示(例如 DOM 或 AudioContext)的事物,或者可能显示用户权限提示的事物。

不适用于工人。解决方法是将这部分代码拆分到屏幕外文档中,并使用消息传递来回传递数据。可以是chrome.runtime 消息传递navigator.serviceWorker也可以是消息传递,支持Uint8Array、Blob、Map等二进制数据。

别名为window

window为了代码清晰或者局部变量被命名为全局属性,请使用它们。

  • 内置globalThis(Chrome/ium 71+、FF 65+)和self

    这些是全局范围内与工作人员兼容的别名。请注意,您正在加载的 JS 库理论上可能会重新定义它们,但这确实很奇怪和不正常。

  • 自制global

    最可靠的方法,但您必须'use strict'仅在 IIFE 内部添加,而不是全局添加。
    webpack 等捆绑程序已经提供了这一功能。
    以下是您可以自行复制的方法:

    const global = (function(){
      if (!this) throw "Don't add 'use strict' globally, use it inside IIFE/functions";
      return this;
    })();
    
    Run Code Online (Sandbox Code Playgroud)