2012-04-18 6 views
3

Я хочу включить фабричный шаблон в свои модули. У меня есть модуль ServiceFactory.js который выглядит следующим образом:Предоставить полномочия модулю для загрузки других модулей

exports.createService = function(serviceName, paramObj){ 
    return require('Services/'+serviceName).Service.new(paramObj); 
}; 

Этот модуль должен требовать другие модули (услуги) своими именами и создать экземпляр. Общие Service.js lookes, как это:

const Base = require('base').Base; 

exports.Service = Base.extend({ 
    getName: function(){ 
     return this.name; 
    }, 
    invoke: function(){ 
     //do something 
    }, 
}); 

Все остальные услуги расширяют базовую услугу. Я собираю все службы в подпапке «Услуги» в «lib». Когда я сейчас использую метод createService моей фабрики, я получаю сообщение об ошибке, например: «Модуль: ServiceFactory ... не имеет права загружать Сервис/...»

Есть ли способ предоставить ServiceFactory полномочия на загрузку моего Услуги или есть другой способ достичь моей цели?

ответ

2

Add-on SDK разрешает все требования, когда надстройка упакована, это не происходит во время выполнения. Я предполагаю, что это делается в основном по причинам производительности (модули могут быть загружены из нескольких мест, поиск этого местоположения при запуске расширения может быть медленным), но есть и аспект безопасности, даже если модуль скомпрометирован (непреднамеренно запускает код что он получен с веб-страницы), он по-прежнему не может загружать дополнительные модули, в частности не модуль chrome. Но конечным результатом является: вы не можете динамически решать, какие модули вы хотите использовать, вы можете загружать только те модули, которые вам явно необходимы в вашем исходном коде.

Работа вокруг в вашем случае будет добавить функцию, которая никогда не вызывается, но имеет все необходимые require() вызовы, чтобы убедиться, что SDK решает их:

function dummy() 
{ 
    require("Services/ServiceFoo"); 
    require("Services/ServiceBar"); 
    ... 
} 

Имея эту функцию в ServiceFactor.js сделает что функция createService() может потребовать эти модули.

+0

Отличная работа. Большое спасибо. –

+0

Другая вещь, которую нужно добавить, заключается в том, что в настоящий момент ваш код не может быть правильно зарегистрирован, если вы используете какую-либо минификацию или несколько запросов в одной строке, например var a = require ('widget'), b = require ('chrome'); Это исправлено и доступно для выхода https://github.com/mozilla/addon-sdk/pull/738, но в настоящее время оно не находится в стабильном выпуске. – jxpx777

Смежные вопросы