2012-04-18 50 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加載我的權力服務還是有另一種方法來實現我的目標?

回答

2

當插件已打包時,附加SDK將解決所有需求,但不會在運行時發生。我猜這主要是出於性能原因(模塊可以從多個位置加載,當擴展運行時搜索這些位置可能會很慢),但也存在一個安全方面 - 即使模塊被泄露(無意運行代碼它來自網頁),它仍然無法加載任何附加模塊,特別是不是chrome模塊。但最終結果是:您無法動態決定要使用哪個模塊,只能加載您在源代碼中明確需要的模塊。

工作,圍繞在你的情況會增加一個是從來沒有所謂,但擁有所有必要的require()電話,以確保該SDK解決它們的功能:

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

具有這種功能ServiceFactor.js將使確定createService()函數可以要求這些模塊。

+0

很好的解決方法。非常感謝。 – 2012-04-18 07:47:23

+0

另一件需要補充的是,目前,如果您在一行中使用任何縮小或多個要求,您的代碼就無法正確註冊,如var a = require('widget'),b = require('chrome');這已經修復並且正式發佈https://github.com/mozilla/addon-sdk/pull/738,但目前它尚未發佈在穩定版本中。 – jxpx777 2013-03-28 14:20:19