JSM расширения Firefox и пространство имен ettiquite

Поэтому в расширениях Firefox рекомендуется, чтобы объекты вашего расширения жили в подобъектах, таких как com.contoso.myExtension . Таким образом, вы не помещаете никаких объектов в глобальное пространство имен, а расширения обычно остаются вне досягаемости друг друга. (По крайней мере, в обычном окне browser.xul)

Но из того, что я понимаю о модулях кода Javascript (JSM), заключается в том, что, хотя сам модуль работает в отдельном пространстве имен, экспортируемые им символы окажутся в глобальном пространстве имен любого кода, импортирующего его. Кроме того, невозможно, чтобы расширение было "хорошим" и пыталось только создавать подобъекты; эти экспортированные символы будут просто уничтожать любые существующие глобальные переменные. Также вы не можете экспортировать такие символы, как com.contoso.myExtension . Это всего лишь простая глобальная переменная.

Так какой протокол для игры хорошо при использовании JSM? Просто сделайте действительно длинные имена переменных и надейтесь, что они не столкнутся?

1 ответ

Решение

Во-первых, я не видел жесткого настоящего стандарта того, как справиться с этим. Но мы определенно можем сделать намного лучше, чем просто длинные имена переменных...

Вы правы относительно модулей кода Javascript, живущих в отдельном пространстве имен (так сказать), однако, когда вы импортируете их, вам не нужно импортировать их в глобальное пространство имен. Если вы посмотрите документацию Components.utils.import, вы увидите, что вы можете импортировать в определенную область. То есть вам вообще не нужно загрязнять глобальное пространство имен.

Вы можете собрать свои модули в myExtension Пространство имен.

var myExtension = {};
Components.utils.import("resource://.../module.jsm", myExtension);

И оборачивая это в самовыполняющуюся функцию, вы не пропустите ни одной переменной в глобальное пространство имен, даже myExtension!

(function(){
    var myExtension = {};
    Components.utils.import("resource://.../module.jsm", myExtension);
})();
Другие вопросы по тегам