背景
业务上需要给小程序各个页面增加营销任务功能,需要在每个页面,根据配置,弹出不同的弹窗。
由于小程序本身并不存在全局路由管理和状态管理的功能,考虑到要新增这两项功能,所以在此之前,先基于小程序的Page函数,来开发插件的注册功能,保障后期的扩展性。
| 首页 | 个人中心 |
|---|---|
实现思路
仿照vue的插件管理机制,由于全局路由管理需要依赖Page函数,所以可以通过劫持Page函数,来达到插件注册的功能。
功能实现
- 1.给Page函数增加plugins属性,用于保存注册的方法。
- 2.给Page函数增加use方法,用于向plugins中保存注册的插件方法,插件方法暴露出一个install方法。
- 3.劫持Page函数,在其初始化的时候执行plugins中的插件方法,调用插件方法的install方法,并传入当前用户配置的config,插件方法通过修改用户config,来达到对代码流程进行管控的目的。
const oldPage = Page
Page = function (config = {}) {
Page.plugins.forEach(plugin => {
plugin.install(config)
})
oldPage(config)
}
Page.plugins = []
Page.use = (plugin = {}) => {
if (typeof plugin.install !== 'function') {
throw new TypeError('Page plugin should has an install method')
}
Page.plugins.push(plugin)
}