无法使用var tabs = require(" sdk / tabs");在WebExtension插件

时间:2016-07-14 13:59:37

标签: javascript firefox-addon firefox-webextensions

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

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

E.g。如果我运行此代码,控制台将输出" 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?');

我已在{em> manifest.json 文件中包含"tabs"作为权限。我是否需要包含其他任何内容才能使用"sdk/tabs"

1 个答案:

答案 0 :(得分:1)

您提到manifest.json个文件,其中包含tabs permission manifest.json 文件仅用于基于WebExtension的附加组件。您希望使用仅require("sdk/tabs")扩展名中提供的Add-on SDK

您似乎在WebExtensions和Firefox Add-on SDK之间混合了API。这是Firefox的四种不同类型extensions中的两种。 WebExtension中没有可用的附加SDK API(High-LevelLow-Level)。同样,基于Add-on SDK的扩展程序无法使用WebExtension JavaScript APIs

具体来说,您似乎正在开发WebExtension。 sdk/tabs API适用于附加SDK。它肯定会在基于WebExtension的插件中无法正常工作。通常,如果您看到require(),您几乎肯定会处理在WebExtension插件中无法使用的附加SDK。因此,您将无法在基于WebExtension的插件中使用require("sdk/tabs")

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

  1. Add-on SDK:这些加载项由package.json文件描述,该文件最初是通过执行jpm init生成的。这些扩展程序通常会使用require()加载High-LevelLow-Level API以与Firefox进行交互。目前,这些加载项在被jpm run加载进行测试或由jpm xpi合并到 .xpi 文件中时被包装到自举扩展中以进行分发(即上传到AMO / Mozilla浏览器)。换句话说,它们是带有SDK包装器的自举扩展 只要扩展名不使用require("chrome"),或者依赖于XUL,XPCOM或XBL,Mozilla似乎承诺继续支持基于附加SDK的扩展。
    可以在引导扩展中完成的大多数事情可以在基于Add-on 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是它们如何运作的描述符。使用"无重启"因为这种类型的附加组件的名称令人困惑,因为附加SDK和WebExtension附加组件也不需要在加载或卸载加载项时重新启动应用程序。出于这个原因,有一种趋势是不再使用" restartless"作为这种附加组件的名称。
    这些加载项有一个名为 bootstrap.js 的JavaScript文件,其中必须包含entry points (functions),这些文件是为加载项startup()shutdown(),{{1}调用的}和install()。 这些加载项包含一个描述加载项的install.rdf 它们通常(但并非总是)包含chrome.manifest文件,该文件描述扩展中的文件和目录如何与Mozilla应用程序(例如Firefox)相关。 覆盖/ XUL / Legacy扩展中可以完成的大部分工作(但不是全部)都可以在自举的附加组件中完成。可以在附加SDK中完成的任何操作都可以在引导扩展中完成(附加SDK扩展是带有一些基于JavaScript的API层的引导附加组件)。 Mozilla已声明他们计划弃用"add-ons that depend on XUL, XPCOM, and XBL."虽然并非所有引导附加组件都依赖于这些技术,但引导附加组件的运行速度往往低于附加SDK和WebExtension添加 - 附件。因此,他们更有可能使用这些技术。虽然有些人表示所有自举附加组件都计划被弃用,但目前尚不清楚是否属实。毕竟,Add-on SDK扩展不会被弃用(除非他们使用uninstall(),或者依赖于XUL,XPCOM或XBL),并且所有附加SDK扩展都是自举扩展,只需使用SDK包装器。
  4. Overlay/XUL/Legacy:这些加载项包含一个描述附加组件的install.rdf和一个用于描述附加组件文件相关内容的chrome.manifest文件(例如覆盖)应用程序的文件。应用程序的加载项功能如何完全依赖于 chrome.manifest 文件中描述的关系。唯一的例外是一些内容,例如扩展程序的图标和描述 install.rdf 文件中指示的扩展程序选项的文件。这些扩展以非常低的级别与应用程序(例如Firefox)交互。当对应用程序进行更改时,这往往会使它们更容易中断 计划弃用所有Overlay / XUL / Legacy扩展程序。