1

"sdk/tabs"似乎无法在我的 Firefox 插件中使用。我想知道怎么了。我的background.js在这部分之后停止处理任何代码:

var tabs = require("sdk/tabs");

例如,如果我运行这段代码,控制台将输出“ error1? ”——包括上面的所有内容,但该片段下面没有任何内容。

console.log('error1?');
var tabs = require("sdk/tabs");
console.log('error2?');

// Listen for tab content loads.
tabs.on('ready', function(tab) {
  console.log('error3?');
  console.log('tab is loaded', tab.title, tab.url);
  console.log('error4?');
});

console.log('error5?');

我已在manifest.json文件中包含"tabs"权限。我需要包括其他任何东西来使用吗?"sdk/tabs"

4

1 回答 1

1

您提到了manifest.json文件并在其中拥有tabs权限manifest.json文件仅用于基于WebExtension的附加组件。您希望使用require("sdk/tabs")仅在附加 SDK扩展中可用的。

您似乎在WebExtensions和 Firefox Add-on SDK之间混合 API 。这是Firefox四种不同类型的扩展中的两种。WebExtension 中没有任何附加 SDK API(无论是High-Level还是Low-Level)。同样,基于附加 SDK 的扩展也无法使用WebExtension JavaScript API 。

具体来说,您似乎正在开发 WebExtension。该sdk/tabsAPI用于附加 SDK。它绝对不会在基于 WebExtension 的插件中工作。一般来说,如果你看到require()你几乎肯定在处理插件 SDK,它不会在你的 WebExtension 插件中工作。因此,您将无法require("sdk/tabs")在基于 WebExtension 的附加组件中使用。

Firefox/Mozilla 有四种不同类型的扩展:

  1. 附加组件SDK:这些附加组件由package.json文件描述,该文件最初是通过执行jpm init. 这些扩展通常用于require()加载High-LevelLow-Level API 以与 Firefox 交互。目前,这些附加组件在加载以供测试jpm run或合并到.xpi文件以jpm xpi供分发(即上传到 AMO/Mozilla)时,会被包装到引导扩展中。换句话说,它们是带有 SDK 包装器的引导扩展。
    Mozilla 似乎致力于继续支持基于附加 SDK 的扩展,只要该扩展不使用require("chrome"),或以其他方式依赖于 XUL、XPCOM 或 XBL。
    大多数可以在引导扩展中完成的事情都可以在基于附加 SDK 的扩展中完成。然而,许多这样的事情绕过了 SDK,这丧失了使用附加 SDK 的很大一部分好处。
  2. WebExtensions:这些附加组件由manifest.json文件描述。此 API 类似于用于 Google Chrome 扩展的 API。虽然 Mozilla 声称此 API 是 Firefox 扩展的未来,但此 API 仍在开发中。现在,您最好使用Firefox Developer EditionFirefox Nightly开发和测试您的 WebExtension 插件。您还应该仔细记下您想要使用的功能所需的 Firefox 版本。此信息包含在 MDN 文档页面的“浏览器兼容性”部分中。
    WebExtensions 使用明显不同的 API。有意地,无法使用任何其他附加类型提供的接口。
  3. Bootstrapped:这些扩展通常也被称为“无重启”,因为它们是第一种不需要重新启动应用程序来加载/卸载附加组件的 Mozilla 扩展。然而,restartless 是它们如何运作的描述。使用“restartless”作为此类附加组件的名称会造成混淆,因为附加组件 SDK 和 WebExtension 附加组件也不需要在加载或卸载附加组件时重新启动应用程序。出于这个原因,有一种趋势是不再使用“restartless”作为此类附加组件的名称。
    这些附加组件有一个名为bootstrap.js的 JavaScript 文件,其中必须包含为附加组件调用的入口点(函数startup()),shutdown()install()uninstall(). 这些附加组件包含一个描述附加组件的install.rdf
    它们通常(但并非总是)还包含一个chrome.manifest文件,该文件描述了扩展中的文件和目录如何与 Mozilla 应用程序(例如 Firefox)相关联。
    大多数(但不是全部)可以在覆盖/XUL/Legacy 扩展中完成的事情可以在引导加载项中完成。可以在附加 SDK 中完成的任何事情都可以在引导扩展中完成(附加 SDK 扩展是带有一些基于 JavaScript 的 API 层的引导附加)。Mozilla 已表示他们计划弃用“依赖于 XUL、XPCOM 和 XBL 的附加组件”。虽然并非所有自举插件都依赖于这些技术,但自举插件倾向于在比插件 SDK 和 WebExtension 插件更低的级别上运行。因此,他们更有可能使用这些技术。虽然有些人说所有引导加载项都计划被弃用,但情况尚不清楚。毕竟,附加 SDK 扩展并没有被弃用(除非它们使用require("chrome"),或者依赖于 XUL、XPCOM 或 XBL),并且所有附加 SDK 扩展都是引导扩展,只是带有一个 SDK 包装器。
  4. Overlay/XUL/Legacy:这些附加组件包含一个描述附加组件的install.rdf和一个chrome.manifest文件来描述附加组件的文件如何与应用程序的文件相关(例如覆盖)。应用程序的附加功能如何完全取决于chrome.manifest文件中描述的关系。唯一的例外是一些东西,比如扩展的图标和描述扩展选项的文件,它们在install.rdf文件中指示。这些扩展在非常低的级别与应用程序(例如 Firefox)交互。当对应用程序进行更改时,这往往会使它们更容易崩溃。
    计划弃用所有 Overlay/XUL/Legacy 扩展。
于 2016-07-18T05:05:00.857 回答