授予模块加载其他模块的权限

时间:2012-04-18 06:48:03

标签: javascript firefox firefox-addon-sdk

我想在我的模块中包含工厂模式。我有一个模块ServiceFactory.js,如下所示:

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

此模块应按名称要求其他模块(服务)并创建实例。将军Service.js看起来像这样:

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

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

所有其他服务扩展基本服务。我在“lib”的子文件夹“Services”中收集所有服务。当我现在使用我工厂的createService方法时,我收到如下错误:“模块:ServiceFactory ...无权加载Service /...”

有没有办法授予ServiceFactory加载我的服务的权限,还是有另一种方法来实现我的目标?

1 个答案:

答案 0 :(得分:2)

Add-on SDK解决了打包加载项时的所有要求,但不会在运行时发生。我想这主要是出于性能原因(模块可以从多个位置加载,在扩展运行时搜索这些位置可能很慢)但也有安全方面 - 即使模块被泄露(无意中运行代码)它来自网页),它仍然无法加载任何其他模块,特别是chrome模块。但最终结果是:您无法动态决定要使用哪些模块,只能加载源代码中明确要求的模块。

在你的情况下解决方法是添加一个从未被调用但具有所有必要require()调用的函数,以确保SDK解析它们:

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

ServiceFactor.js中使用此功能将确保createService()功能可以要求这些模块。