Skip to content

插件系统

hefangshi edited this page Jun 5, 2015 · 2 revisions

yog2 插件系统是整个框架的骨架。在 yog2 中,从中间件管理到日志系统和FIS静态资源管理,所有功能的引入都是以插件的形式引入的,因此在了解每个功能的具体用法之前,我们需要对插件系统有一个整体的了解。

yog2 插件系统的设计目标是

  • 通过插件系统实现功能与配置的分离
  • 功能由插件自身实现
  • 配置由插件系统统一管理,完全暴露给用户

这样设计的优点是我们可以对 yog2 project 的运行时核心进行整体升级,但是其中的功能调整能够对用户在一定程度上是透明的。

以中间件的管理为例,YOG2为了方便使用,默认引入了多个中间件。如果在app.js中引用,虽然用户可以灵活修改,但是会与用户代码混杂,导致后续无法升级。而全部在框架的核心库中实现会导致用户很难知道框架内部的中间件是按照何种顺序加载的。

内置插件

  • dispatcher

    自动路由分发插件,提供全局函数yog.dispatcher

  • http

    中间件管理插件,通过配置,用户可以方便的管理中间件加载顺序和新增中间件

  • log

    日志插件,提供全局函数yog.log

  • ral

    后端服务管理插件,提供全局函数yog.ral

  • views

    FIS静态资源管理与模板插件

用户插件

用户插件存放在Yog项目的plugins目录中,插件是有其严格的目录规范的

├─yog              # Yog根目录
  └plugins          # 用户插件目录
      └userPlugins  # 插件目录
          └index.js # 插件入口

其中插件入口必须在一个文件夹中,并且名称必须为index.js。

相应的,插件的实现也有进一步要求

// 插件逻辑
module.exports.userPlugins = function(app, conf){
    
}

// 设置插件默认配置
module.exports.userPlugins.defaultConf = {

}
  • app为yog.app对象,即Express的app
  • conf为插件的配置项
  • module.exports后的属性名就是插件的真实名称

实际上你也可以在一个index.js中编写多个插件。

module.exports.userPluginsA = function(app, conf){
    
}

module.exports.userPluginsB = function(app, conf){
    
}

此外,对于需要异步加载的插件,也支持异步初始化

module.exports.userPlugins = function(app, conf, cb){
    cb && cb();
}

module.exports.userPlugins.defaultConf = {

}

插件依赖

插件与插件之间是可以声明加载依赖的,举例来说,如果希望插件B在插件A加载后再执行,只需要调整插件的写法即可

// plugins/A/index.js
module.exports.A = function(app, conf){
};
// plugins/B/index.js
module.exports.B = ['A', function(app, conf){
}];

这样,仅当插件 A 初始化完成后,才会开始插件 B 的初始化工作

此处的语法与async.auto保持一致

插件配置

插件的配置均存放在 yog2 project 的 conf/plugins 文件夹中,与插件编写规则一致,配置也需要通过属性名显示声明配置所属的插件

// conf/plugins/A.js
module.exports.A = {

}

编写在 conf/plugin 中的插件配置,会在启动器初始化插件时,自动将配置传递给插件。