2016-08-04 2 views
0

Ich bin neu in der Entwicklung von Erweiterungen. Momentan teste ich eine Firefox Erweiterung, die mit dem Add-on SDK entwickelt wurde. Ich möchte HTM5 Localstorage verwenden, um etwas aus einem der Hintergrundskripts in meiner Erweiterung zu speichern, die von einem anderen Hintergrundskript der gleichen Erweiterung abgerufen werden. Npm (Node Packet Manager) wurde verwendet, so das Problem ist, ich bin nicht in der Lage, Browser LocalStorage Objekt zu verwenden, ReferenceError: localStorage is not defined ist, was ich bekomme.Wie node-localstorage von der Browsererweiterung zu verwenden ist, die npm verwendet

Durch das Surfen lernte ich über Knoten-Localstorage kennen. Ich befolge die Anweisungen von https://www.npmjs.com/package/node-localstorage. Aber, wenn ich meine Erweiterung mit dem angegebenen Code in dem obigen Link zu testen, bekomme ich einen Fehler:

Message: Module `localStorage.js` is not found at resource://gre/modules/commonjs/localStorage.js 

Stack: 
[email protected]://xxx-at-xyz-dot-com/scripts/Somescript.js:3:23 
@resource://xxx-at-xyz-dot-com/index.js:6:11 
[email protected]://gre/modules/commonjs/sdk/addon/runner.js:147:19 
startup/</<@resource://gre/modules/commonjs/sdk/addon/runner.js:87:9 
[email protected]://gre/modules/Promise-backend.js:933:23 
[email protected]://gre/modules/Promise-backend.js:812:7 
this.PromiseWalker.scheduleWalkerLoop/<@resource://gre/modules/Promise-backend.j s:746:1 – 

Hier ist eine Annäherung, wie ich versuche, localstorage zu verwenden:

//Somescript.js (background script) 

module.exports = function() { 
    this.watchTab = function (tabId, port, url) { 
     //some code 
     localStorage.setItem("key","value"); 
     // some code 
    } 
} 

Die Linie localStorage.setItem("key","value") löst einen Fehler aus ReferenceError: localStorage is not defined. Dies ist der Grund, warum ich localStorage nicht verwenden kann.

+0

Eine erste Frage wäre, warum verwenden Sie node-localStorage statt HTML5 localStorage? Könnten Sie mehr Details über den Fehler geben? –

+0

Ich versuchte HTML5 localstorage verwenden, aber das Problem, das ich ist RefernceError bin immer: Fenster nicht definiert ist, wenn ich Funktion storageAvailable (Typ) verwenden { \t try { \t \t var storage = Fenster [Typ], \t \t \t x = ' __storage_test__ '; \t \t storage.setItem (x, x); \t \t storage.removeItem (x); \t \t Rückkehr wahr; \t} \t catch (e) { \t \t Rückgabe false; \t} } – wittyrandhir

+0

Fensterobjekt ist in der Umgebung node.js nicht verfügbar.Ähnlich ist localStorage nicht verfügbar. – wittyrandhir

Antwort

1

Bei Verwendung des Firefox Add-on SDK sollten Sie stark auf die Verwendung der High Level APIs ausgerichtet sein. Wenn diese nicht tun, was Sie wollen, schauen Sie sich die Low-Level APIs. Nur wenn keine der oben genannten Maßnahmen Ihren Anforderungen entspricht, sollten Sie andere Optionen ausprobieren. Einer der Gründe, warum diese APIs existieren, besteht darin, dass Sie Add-ons mit weniger Bedenken schreiben können, wenn Sie große Anstrengungen unternehmen müssen, um Ihren Code bei der Entwicklung und Änderung von Firefox beizubehalten.

Angenommen, Ihre Frage ist wirklich "Wie kann ich Daten in einem lokalen Speicher von meiner Add-on SDK-Erweiterung speichern?", Dann sollten Sie mindestens die API simple-storage in Betracht ziehen, die ein Standardteil des Add ist -on SDK.

Angenommen, Sie Code verwenden, ähnlich wie in Ihrer Frage ist, sollten folgende Arbeiten:

//Somescript.js (background script) 
var simpleStorage= require("sdk/simple-storage"); //Usable elsewhere in your code. 
module.exports = function() { 
    this.watchTab = function (tabId, port, url) { 
     //some code 
     simpleStorage.storage["key"] = "value"; 
     // some code 
    } 
} 

Hinweis: Ihr Code nicht klar machen, wenn key und value sollten Variablen oder Zeichenketten in Betracht gezogen werden.

Hinweis: Wenn Sie jpm run verwenden, um Ihr Add-on zu entwickeln und zu testen, müssen Sie specific profile verwenden, damit der Speicher über mehrere Durchläufe hinweg bestehen bleibt. Sie können dies tun, indem Sie die --profile and -nocopy options to jpm verwenden.

Verwandte Themen