在小程序插件中使用globalData数据
公司现在上小程序项目在对接第三方商城的时候,为了降低开发成本,使用了一个比较粗陋的方式,直接从对方的小程序跳转到我司的小程序,但这种用户体验巨差,前期合作暂时可以接受,但是长期来看这种交互方式肯定不行,这个梗一直横在心里,想着什么时候将其解决掉,可一直被其他的事情占着没有时间来处理这块儿,当然方案不是没想过,长远来看,选用uniapp或者taro来做跨段应用是个不错的选择,但是需要从头开始开发,周期太长,并不是现阶段最优方案,除了直接跳转的方式,如果快速且低成本的做到无缝切换呢?
思考良久,依然没有什么比较好的答案,后来猛然间听别人提起了小程序插件这个词,真的是如醍醐灌顶,小程序插件之前不是没在文档中看到,但是根本没有仔细去看,晃了一眼就过去了,也怪自己粗心了,刚好这次认真的去看了一下小程序插件的描述和开发文档(https://developers.weixin.qq.com/miniprogram/dev/framework/plugin/),确认了眼神,他真是我要的东西,真是有种众里寻他千百度,蓦然回首,那人却在灯火阑珊处的感慨,虽然确认了这东西可以解决我的问题,但是真是要实施依然有很多问题要解决:
1、我们小程序编辑模块的数据全部存储在globalData里面,但是在小程序插件中我们却不能直接使用globalData,因为不存在getAPP方法,如果不能使用globalData,那么相当于编辑器里面改变数据的方式全部要改掉,这个工程量依然很浩大,不可控,而且使用其他的存储方式比如storage如果存储策略控制不好,可能会导致更糟糕的问题,导致小程序崩掉,在遍寻小程序插件的文档和微信开发者社区无果后,我又求助了度娘,进行了大量的搜索,依然没有找到自己想要的答案,而且关于小程序插件方面的文章非常非常少,无奈,我只能再次一遍遍的去看官方文档,试图从中发现些什么。
刚开始我想到了使用wx.navigateTo来传递参数,例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
// 调用 wx.navigateTo({ url: 'plugin page', success: function(res) { res.eventChannel.emit('data', getApp().globalData); } }); // page Page({ onLoad: function(option){ const eventChannel = this.getOpenerEventChannel() eventChannel.on('data', data => { this.globalData = data }) } }) |
这种方式虽然能解决现有问题,但是很容易出错,需要保证整个传输链条不断掉,相当于每一个wx.navigateTo都要传递globalData,plugin中的每一个页面都需要接受globalData,实现上面代码中所示相同的逻辑。这种方案依然感觉不是他好。
后来偶然间看到了requireMiniProgram这个方法,文档:https://developers.weixin.qq.com/miniprogram/dev/reference/api/requireMiniProgram.html,虽然描述很简单,但是我知道这正是我所寻找的,我们只需要在使用小程序插件的小程序中定义并导出方法:
1
2
3
4
5
|
module.exports = { getGlobalData: () => { return getApp().globalData; } } |
然后导出到插件
1
2
3
4
5
6
7
|
{ "myPlugin": { "version": "1.0.0", "provider": "wxidxxxxxxxxxxxxxxxx", "export": "exportToPlugin.js" } } |
在小程序插件中的任意位置我们只需要调用
1
|
requireMiniProgram().getGlobalData() |
就可以获取到小程序的globalData数据了。
使用这种方案,对于我们将编辑器开发为插件也是很方便的,我们只需要将代码中的
1
|
getApp().globalData |
换成
1
|
requireMiniProgram().getGlobalData() |
就可以了。其他可能就是一些细节的调整。
写在最后:
1、上面的方式不仅仅可以用来处理globalData使用的问题,也可以用来解决我们在小程序插件中不能使用小程序部分方法的问题。
2、使用小程序插件我们不仅可以在不泄露源代码的情况下无缝对接第三方,优化使用体验,而且可以做到异步发布,我们对于编辑器的优化更新不依赖于我们对接的第三方,我们发布后,所有对接第三方的插件都会得到更新,从某一方面来看也降低了维护的成本。