2016-07-14 50 views
1

"sdk/tabs"似乎不可能在我的Firefox附加组件中使用。我不知道什么是错的。我background.js这部分后停止处理任何代码:无法使用var tabs = require(“sdk/tabs”);在WebExtension附加组件

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"

+2

哇,这很奇怪。你能把我们链接到你的完整代码吗,它在github上吗? – Noitidart

+0

为什么你有一个[* manifest.json *](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/manifest.json)文件?该文件名用于[WebExtensions](https://developer.mozilla.org/en-US/Add-ons/WebExtensions)。 Firefox [附加SDK](https://developer.mozilla.org/en-US/Add-ons/SDK)扩展应该有一个[* package.json *](https://developer.mozilla.org/ en-US/Add-ons/SDK/Tools/package_json)文件,最初由['jpm init']生成(https://developer.mozilla.org/en-US/Add-ons/SDK/Tools/jpm #jpm_init)。 – Makyen

+0

Noitidart这是一份私人工作,所以我不能提交给Github。但似乎我一直在困惑附加组件和WebExtensions。 谢谢,Makyen。我正在研究WebExtensions。它也似乎更适合将Chrome扩展程序转换为Firefox。谢谢你的回复! – Krmtlis

回答

1

您提到了一个manifest.json文件并且其中有tabs permissionmanifest.json文件仅用于基于WebExtension的加载项。您希望使用仅在Add-on SDK扩展中可用的require("sdk/tabs")

您似乎在混合使用WebExtensions和Firefox Add-on SDK之间的API。这些是Firefox的四种不同类型extensions中的两种。从WebExtension中没有任何附加SDK API(High-LevelLow-Level)都不可用。类似地,WebExtension JavaScript APIs不支持基于附加SDK的扩展。

具体而言,您似乎正在开发WebExtension。 sdk/tabs API适用于附加SDK。它肯定会在基于WebExtension的插件中工作不工作。一般来说,如果您看到require(),那么您几乎可以肯定地处理附加SDK,该附加SDK在您的WebExtension插件中不起作用。因此,您将无法在基于WebExtension的加载项中使用require("sdk/tabs")

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

  1. Add-on SDK:这些附加组件通过其最初由执行jpm init产生的package.json文件中描述。这些扩展程序通常会使用require()加载High-LevelLow-Level接口与Firefox。目前,当这些附加组件被加载用于测试jpm run或合并到.xpi文件jpm xpi以供分发(即,上传到AMO/Mozilla)时,这些附加组件被封装到引导扩展中。换句话说,它们是使用SDK包装器引导的扩展。
    只要扩展程序不使用require("chrome"),或者依赖于XUL,XPCOM或XBL,Mozilla似乎承诺继续支持基于附加SDK的扩展。
    可以在引导扩展中完成的大部分事情都可以在基于SDK的附加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扩展,它不需要为了加载/卸载加载项而重新启动应用程序。但是,无重启是它们如何工作的描述符。使用“无重启”作为此类附加组件的名称会造成混淆,因为附加组件SDK和WebExtension附加组件也不需要在加载或卸载附加组件时重新启动应用程序。出于这个原因,有一种倾向是不再使用“无重启”作为这种附加组件的名称。
    这些插件有一个叫做bootstrap.js必须包含entry points (functions)这是所谓的附加startup()shutdown()install()uninstall() JavaScript文件。 这些加载项包含描述加载项的install.rdf
    它们通常但不总是包含一个chrome.manifest文件,该文件描述扩展中的文件和目录与Mozilla应用程序(例如Firefox)的关系。
    大部分但不是全部的可以在overlay/XUL/Legacy扩展中完成的事情都可以在引导加载项中完成。任何可以在附加SDK中完成的事情都可以在引导扩展中完成(附加SDK扩展是带有一些基于JavaScript的API层的引导附加组件)。 Mozilla表示他们计划弃用"add-ons that depend on XUL, XPCOM, and 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扩展。
+0

感谢深入解释。 – Poutrathor

相关问题