Как разделить код между скриптом контента и аддоном? - PullRequest
8 голосов
/ 21 июня 2011

Я пишу расширение для Firefox 4+.

У меня есть код в файле с именем utils.js, который я хотел бы вызвать как из main.js аддона, так и из скрипта содержимого page-mod.

Можно ли сослаться с обоих на одно и то же utils.js?Если да, то как?

Редактировать: еще лучше было бы решение, позволяющее мне использовать тот же код в расширении Google Chrome.

Ответы [ 4 ]

2 голосов
/ 25 июля 2011

Я столкнулся с этой же проблемой.Вы думаете, что было бы очевидное решение.Вот что я делал для Firefox (не работал с Chrome):

У меня есть файл lib / dbg.js, содержащий мои основные функции отладки, которые я хочу использовать везде.

В каждом модуле содержимого сценариев в моем main.js у меня есть это:

contextMenu.Item({
...
contentScript: export_internals(require('dbg')),
contentScriptFile: my-actual-scripts.js
...

, а затем в main у меня есть функция

function export_internals(module) {
    var code = '';
    for (name in module) {
        var val = module[name];
        if (val.constructor === String)
            code += name + ' = "' + val + '";';
        else
            code += val;
    }
    return code;
}

, которая в основном просто циклически проходит через экспортированные свойства(переменные, функции и т. д.) и использует такие вещи, как Function.toString (), чтобы в основном построить строковую версию модуля dbg и передать ее как встроенный скрипт содержимого.Эта функция, вероятно, не очень общая, поскольку я только что написал ее для обработки простых функций и строк (только два нужных мне типа данных), но этот принцип должен легко применяться, даже если вы просто делаете что-то вроде

contentScript: require('dbg').my_function.toString()

Это явно что-то вроде взлома, но пока довольно надежный.Это то, что вы искали?

1 голос
/ 09 декабря 2011

Мое решение состояло в том, чтобы

  1. поместить всю "логику" (и мой модуль "utils") в код дополнения
  2. сделать скрипт содержимого максимально простым
  3. и всякий раз, когда скрипту контента нужна информация, которая потребует модуля utils, я использую асинхронную систему связи между скриптом контента (self.port.emit, self.on ...) и кодом дополнения (worker.port.on ...)

Решение позволило улучшить дизайн моего аддона.Но я не знаю, сработает ли асинхронный подход в вашей ситуации.

0 голосов
/ 05 апреля 2012

Спасибо за указатель на Реализация многоразовых модулей на дополнительном сайте Mozilla, посвященном SDK. Я до сих пор не совсем понимаю, как сделать вызов exports. В их примере они используют одно и то же имя для функции и файла. Так, в строке exports.translate = translate; слева translate относится к функции translate(), а справа - к файлу translate.js, или, может быть, наоборот ?

Magnoz 'ответ выше (в котором имя функции и имя файла отличаются из-за caSE sENSITiVitY), кажется, предлагает мне просто дважды использовать имя функции и игнорировать имя файла. Это тот случай?

0 голосов
/ 14 июля 2011

Поскольку я не смог найти существующее решение, я сейчас просто копирую один и тот же файл в несколько каталогов (как часть процесса сборки / отладки).

На данный момент это работает лучше всего, особенно потому, что большая часть исходного кода повторно используется и в реализации расширения Google Chrome.

Чтобы сделать utils.js пригодным для использования в скриптах содержимого Firefox и в Chrome (оба не имеют CommonJS), я импортирую его так:

var Utils = Utils || require('utils').Utils; 

Соответствующие части utils.js выглядят так:

function initUtils() {
    var result = {
        // ..define exported object...
    };
    return result;
};

// Chrome
var Utils = initUtils();
var exports = exports || {}; 
// Firefox
exports.Utils = Utils;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...