近期用 thinkjs3 实验业务的时候,希望拥有『业务插件』功能,如果登录验证码、短信发送、第三方登录等,这样团队在开发的过程中就可以只去做相应的业务插件,而非直接在基础项目中硬编码。
thinkjs3 框架提供的框架级的插件机制是:
- 基于 Koa 2.x,兼容 middleware
- 支持 Extend、Adapter 等插件方式
如果想实现我要达到的效果还是没有现成的机制,需要做些扩展,参考了一些基于 thinkjs 的项目,如果 CmsWing,它实现的插件功能比较简单粗暴,它的插件目录如下:
├── controller
│ ├── admin
│ ├── api
│ ├── center
│ ├── cmswing
│ ├── ext # 插件主目录
│ │ ├── ad # 具体插件(广告插件)
│ │ │ ├── admin.js # 插件的 controller
│ │ │ ├── config.js # 插件配置
│ │ │ ├── model # 插件 model
│ │ │ └── view # 插件视图文件目录
│ │ ├── atlas
│ │ ├── ……
│ ├── home
│ └── mod
直接嵌入进 controller 中,可以读性比较差,且概念上不好理解,但是简单好用。
我们希望效果如下:
.
├── addons # 插件目录
│ ├── ad # 插件(广告)
│ │ ├── config.js # 插件配置
│ │ ├── controller # 插件 controller 目录
│ │ ├── model # 插件 model 目录
│ │ └── views # 插件视图文件 目录
│ └── captcha
├── admin
│ ├── controller
│ └── views
├── api
├── common
└── home
这样我们认为是比较方便后续做插件开发,拥有独立的目录,和独立的逻辑组成,插件有自己的 controller、model、view,以独立文件夹存在,在整个工程中有独立的插件集合目录。
前文说过 thinkjs 本身并没有提供这样的机制,因些要实现起来还需要做些工作:
1、用 thinkjs 建立一个支持多模块的工程
2、建立 addons 目录
3、在 common/bootstrap 的 worker 中将 addons 目录下的插件加载处理
网友评论