2016-07-14 52 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

相關問題