为Firefox扩展实现Javascript插件系统

为Firefox扩展实现Javascript插件系统,javascript,html,firefox,firefox-addon,xul,Javascript,Html,Firefox,Firefox Addon,Xul,我们正在尝试构建一个Firefox扩展,其中我们的扩展将包含大量Javascript插件。这里的插件定义为一组具有主入口点的函数,它们通常提供响应。在OOP中,它们将共享相同的公共抽象类,并且可以预见$obj->init()->run()->get()链 它们将是一个插件池,每个插件都应该有一个等级,插件的执行应该基于它们的等级 主要问题是: -如何在纯Javascript中创建插件系统 -是否有JS中的开源插件系统可用于start -您将如何存储插件池系统及其排名,以及 -您如何确保插件按其排

我们正在尝试构建一个Firefox扩展,其中我们的扩展将包含大量Javascript插件。这里的插件定义为一组具有主入口点的函数,它们通常提供响应。在OOP中,它们将共享相同的公共抽象类,并且可以预见$obj->init()->run()->get()链

它们将是一个插件池,每个插件都应该有一个等级,插件的执行应该基于它们的等级

主要问题是:
-如何在纯Javascript中创建插件系统
-是否有JS中的开源插件系统可用于start
-您将如何存储插件池系统及其排名,以及

-您如何确保插件按其排名顺序执行?您的问题非常模糊,因此我将根据大量猜测来回答。您可能想做一些类似于内部所做的事情—将插件加载到中,为它们提供一些API,并根据需要调用它们的方法。另外,我猜您希望使用来确保沙箱没有额外的特权。这样做应该可以:

Components.utils.import(“resource://gre/modules/Services.jsm");
var sandboxProto={
职级:-1,
foo:function()
{
抛出新错误(“请执行”);
},
myAPIMethod:function()
{
返回5;
}
};
var sandboxPrincipal=Components.classes[“@mozilla.org/nullprincipal;1”]
.getService(组件、接口、主体);
var插件=[];
函数loadPlugin(url)
{
尝试
{
var sandbox=Components.utils.sandbox(sandboxPrincipal{
sandboxName:url,
sandboxPrototype:sandboxProto
});
Services.scriptloader.loadSubScript(url,沙盒);
插件推送(沙盒);
}
捕获(e)
{
组件.utils.reportError(e);
}
}
函数callPluginMethod(methodName)
{
var args=Array.prototype.slice.call(参数,1);
//总是求助于插件,以防它们的排名发生变化
plugins.sort(函数(a,b)
{
//确保我们使用数字
var r1=parseInt(a.rank,10)| |-1;
var r2=parseInt(a.rank,10)| |-1;
返回r2-r1;
});
var结果=[];
for(var i=0;i
插件应该是这样的:

var秩=1000;
函数foo()
{
返回2*myAPIMethod();
}
因此,下面的代码应该向您显示
[10]

loadPlugin(“chrome://.../content/plugin.js");
var结果=callPluginMethod(“foo”);
警报(results.toSource());

至于您的扩展如何知道在哪里可以找到它的插件,这是一个完全不同的问题,并且很大程度上取决于需求(这个问题中缺少了一些东西)。然而,请注意,下标加载器只适用于本地URL—只有属于扩展的一部分或位于用户磁盘上的插件才能工作。如果插件列表将是动态的,那么您可能希望在用户配置文件中为它们创建一个目录,并根据需要将它们下载到此目录(您应该非常小心,不要给这些插件太多特权,以避免安全问题).

我想你希望你的插件是沙盒而不是完全的特权?@WladimirPalant在这个阶段我不关心沙盒,因为在初始阶段我将是唯一的开发者,但是我需要想法。我看你是这方面的专家。你们能分享一些答案吗?我们也会在服务器端提供这些插件,实际上它们对DOM对象做了一些事情。我们想知道是否可以通过在Node.JS中使用服务器端组件来实现代码重用。据您所知,是否可以从扩展中获取某些Javascript对象并将其放置在不同的JS服务器中,以使两者具有相同的功能?当然可以,只要访问的API同时存在于客户端和服务器上。按照CommonJS在客户端提供
require()
函数可能是最简单的。但这是一件很容易实现的事情。