Как использовать node-localstorage из расширения браузера, использующего npm

Я новичок в разработке расширений. Сейчас я тестирую расширение Firefox, разработанное с помощью Add-on SDK. Я хочу использовать HTM5 localstorage для хранения чего-либо из одного из фоновых скриптов в моем расширении, которое будет извлечено из другого фонового скрипта того же расширения. npm (Node Packet Manager) был использован, поэтому проблема в том, что я не могу использовать объект браузера localStorage, ReferenceError: localStorage is not defined это то, что я получаю.

По сёрфингу я узнал о node-localalstorage. Я следую инструкциям из https://www.npmjs.com/package/node-localstorage. Но, когда я тестирую свое расширение с указанным кодом в ссылке выше, я получаю сообщение об ошибке:

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

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

Вот примерное представление о том, как я пытался использовать localStorage:

//Somescript.js (background script)

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

Линия localStorage.setItem("key","value") выдает ошибку ReferenceError: localStorage is not defined. По этой причине я не могу использовать localStorage.

1 ответ

При использовании дополнения Firefox SDK вы должны быть сильно склонны к использованию API высокого уровня. Если они не делают то, что вы хотите, посмотрите на API низкого уровня. Только если ничего из вышеперечисленного не подходит для ваших нужд, вам следует изучить другие варианты. Одна из причин, по которой эти API существуют, заключается в том, что вы можете писать дополнения, не заботясь о том, чтобы тратить большие усилия на поддержание вашего кода по мере разработки и изменения Firefox.

Если предположить, что ваш вопрос действительно "Как я могу хранить данные в локальном хранилище какого-либо типа из моего расширения SDK надстройки?", То вы должны хотя бы рассмотреть API - интерфейс простого хранилища, который является стандартной частью надстройки. SDK.

Предполагая, что вы используете код, аналогичный тому, что есть в вашем вопросе, должно работать следующее:

//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
    }
}

Примечание: ваш код не дает понять, если key а также value следует рассматривать переменные или строковые литералы.

Обратите внимание, если вы используете jpm run Чтобы разработать и протестировать надстройку, вам потребуется использовать определенный профиль, чтобы хранилище сохранялось при нескольких запусках. Вы можете сделать это с помощью --profile а также -nocopy варианты в jpm.

Другие вопросы по тегам