bnorth 参考了主流的框架设计思想,采用微内核与插件扩展机制。提供更好的定制和扩充性,降低了体积。也为 bnorth 逐渐积累功能,形成一站式开发套件的核心思想提供了技术可行性。
插件可以接收事件和管理数据单元,被安装到 app 后,会触发 onPluginMount 事件处理函数进行插件初始化。插件主要是定制或者修改 app 及挂载在 app 上的模块,或者挂载新模块到 app 上。
使用插件一般在 app.start 之前,通过插件管理器的方法进行安装操作。安装时有 2 个参数,一个是插件描述对象,一个是可选的插件参数。例如安装一个浏览器操作插件,并指定参数 { autoTitle: true}
。
app.plugins.add(require('@bnorth/plugin-browser').default, {autoTitle: true});
该插件向 app 挂载了一个 browser 模块,之后用户可以通过该模块调用插件提供的功能,比如设置浏览器标题。
app.browser.title = 'plugin';
该插件也同时注册了 onPageActive 事件处理函数,当用户设置了 autoTitle 为 true 时,页面切换时,该插件将设置浏览器标题为当前页面路由配置信息的 title 参数。
安装后的插件就会生成插件实例,可以通过插件管理器获取,获取后可以直接使用插件的属性方法和插件的数据单元。因此也可以通过插件共享数据单元。
如果需要开发一个功能,比如即时通讯,那么完成可以以插件形式开发和使用。使业务代码和功能代码分离,还可以为其他 bnorth 项目共享该功能。如果业务代码里有需要全局访问的功能,或者数据共享的功能,或者有全局事件处理的需求,比如定位功能各个页面可能都需要,这些使用插件方式都是非常好的选择。
开发插件实际是编写一个插件声明对象或者返回插件声明对象的函数,如果是函数,将获取两个参数 app 和 添加插件是的参数,例如:
export default (app, options)=>({
id: 'xxx',
_dependencies: ['request', 'storage'],
onPluginMount: ()=>{},
onPluginUnmount: ()=>{},
onXXX: ()=>{},
stateXXX: {},
xxx: xxx,
})
插件声明对象一般具有如下属性:
插件由插件管理模块负责插件的生命周期管理:
app 插件是可选的从 App 构建参数的 plugin 属性传入的在 App 实例化时创建的第一个插件:
import App from '@bnorth/core';
let app = new App({
plugin: {
stateData: {},
}
})