Node.JS的插件系统

时间:2014-05-04 08:05:45

标签: javascript node.js plugins express module

我目前正在Node.JSExpress处理一个大型应用程序。

我希望能让插件兼容,所以我开始编写自己的小插件系统,其文件结构如下:

root/
|   plugins.json            # configures all plugins
|   plugins                 # contains all plugins
|   |   MyPlugin            # contains MyPlugin
|   |   |   MyPlugin.js     # defines Application hooks for MyPlugin
|   |   |   ...

MyPlugin/当然还包含路由,控制器,视图,特定资源等。

app将在MyPlugin的实例上调用的标准挂钩是:

moduleInit(app)             # before starting the server or module has been loaded (if server is already running at module load)
moduleStart(app)            # right after server has been started or not at all
moduleCleanup(app)          # right before the party ends

到目前为止,这么好,但现在事情变得更复杂了(而且它们总是变得更复杂),因为我必须考虑模块初始化的顺序(因为它们可能会将自己附加到处理程序堆栈{{{ 1}},useget等),等等...

由于我对Node和Express还有点新手,我开始怀疑: 可能已经有一个好的引擎可以做到这一切吗?我找不到一个,这让我相信这可能是一个坏主意?也许还有一个更“节点” - 或“表达” - 这种方式可以做我忽略的事情?

感谢您的帮助!

2 个答案:

答案 0 :(得分:6)

不要浪费精力重新发明轮子 - 使用名为NPM Modules的现有解决方案:) 你觉得这不是那种方式是对的。

IMO的最佳方法是NodeJs的NPM模块,你可以自己写一些。

至于“get”/“post”/ etc的处理程序绑定执行顺序 - 你仍然可以控制程序包加载顺序,不要忘记,所以你可以用“标准”方式实现它。 / p>

编辑#1:

  1. 您可以使用 private
  2. 对于高度专业化的子组件示例,我建议您查看 PassportJS 项目。这是关于Facebook和Google等外部平台的身份验证,您希望在项目中启用的每个平台都是一个单独的NPM模块。
  3. 是什么让您认为无法在运行时卸载/重新加载模块?是的,你可以。

答案 1 :(得分:1)

我没有使用它,但建筑师可能符合账单https://github.com/c9/architect

  

Architect是Node.js应用程序的一个简单但功能强大的结构。使用Architect,您可以设置一个简单的配置并告诉Architect您要加载哪些插件。每个插件都使用Architect注册,因此其他插件可以使用其功能。插件可以作为NPM包进行维护,因此可以将它们放入其他Architect应用程序中。