一般来讲各个小程序开放平台对于插件开发的开放范围有一定的限制,例如微信小程序平台开放了22个行业相关的插件开发,其中对医疗服务、金融业、文娱、社交等行业还有进一步的特殊限制。
在了解小程序插件的开发规范后,如何以正确的方式开始小程序插件的开发呢?其实各大平台都出了响应的开发工具和开发指南。
我们同样以微信和支付宝为例,使用微信开发者工具和支付宝IDE工具即可高效率的完成一个小程序插件的创建和开发,具体的开发指南可访问:
微信小程序插件开发:https://developers.weixin.qq.com/miniprogram/dev/devtools/plugin.html
支付宝小程序插件开发:https://opendocs.alipay.com/mini/plugin/plugin-development
1、小程序插件引入
对于更多的用户我们可能需要对插件进行引入,如何在小程序中引入插件呢?这里我们以FinClip 小程序为例进行实践。
开发者可在小程序代码中引入插件代码的声明,然后在使用 FIDE 开发工具进行编译时, FIDE 会从服务端获取插件代码一起进行打包编译。
请注意 插件功能需要在基础库版本≥2.11.1,SDK版本≥2.34.0的环境下才可使用
2 添加插件
在使用插件前,开发者可登录「小程序开放平台-小程序管理-小程序插件」,通过插件 ID 查找插件并添加。
3 引入插件代码包
使用插件前,使用者要在 app.json 中声明需要使用的插件,例如:
代码示例
代码语言:javascript复制{
"plugins": {
"myPlugin": {
"version": "1.0.0",
"provider": "插件 id"
}
}
}
如上例所示, plugins 定义段中可以包含多个插件声明,每个插件声明以一个使用者自定义的插件引用名作为标识,并指明插件的 ID 和需要使用的版本号。
其中,引用名(如上例中的 myPlugin)由使用者自定义,无需和插件开发者保持一致或与开发者协调。在后续的插件使用中,该引用名将被用于表示该插件。
4在分包内引入插件代码包
如果插件只在一个分包内用到,可以将插件仅放在这个分包内,例如:
代码语言:javascript复制{
"subpackages": [
{
"root": "packageA",
"pages": [
"pages/cat",
"pages/dog"
],
"plugins": {
"myPlugin": {
"version": "1.0.0",
"provider": "插件 id"
}
}
}
]
}
在分包内使用插件有如下限制:
- 仅能在这个分包内使用该插件;
- 同一个插件不能被多个分包同时引用;
5使用插件
使用插件时,插件的代码对于使用者来说是不可见的。为了正确使用插件,使用者应查看插件详情页面中的“开发文档”一节,阅读由插件开发者提供的插件开发文档,通过文档来明确插件提供的自定义组件、页面名称及提供的 js 接口规范等。
6自定义组件
使用插件提供的自定义组件,和 使用普通自定义组件 的方式相仿。在 json 文件定义需要引入的自定义组件时,使用 plugin:// 协议指明插件的引用名和自定义组件名,例如:
代码示例
代码语言:javascript复制{
"usingComponents": {
"hello-component": "plugin://myPlugin/hello-component"
}
}
出于对插件的保护,插件提供的自定义组件在使用上有一定的限制:
- 默认情况下,页面中的 this.selectComponent 接口无法获得插件的自定义组件实例对象;
- ft.createSelectorQuery 等接口的 >>> 选择器无法选入插件内部。
7页面
需要跳转到插件页面时,url 使用 plugin:// 前缀, 如:
代码示例
代码语言:javascript复制<navigator url="plugin://myPlugin/hello-page">
Go to pages/hello-page!
</navigator>
8 js 接口
使用插件的 js 接口时,可以使用 requirePlugin 方法。例如,插件提供一个名为 hello 的方法和一个名为 world 的变量,则可以像下面这样调用:
代码语言:javascript复制var myPluginInterface = requirePlugin('myPlugin');
myPluginInterface.hello();
var myWorld = myPluginInterface.world;
也可以通过插件的 id 来获取接口,如:
代码语言:javascript复制var myPluginInterface = requirePlugin('插件 id');
9导出到插件
使用插件的小程序可以导出一些内容,供插件获取。具体来说,在声明使用插件时,可以通过 export 字段来指定一个文件,如:
代码语言:javascript复制{
"myPlugin": {
"version": "1.0.0",
"provider": "插件 id",
"export": "index.js"
}
}
则该文件(上面的例子里是 index.js)导出的内容可以被这个插件用全局函数获得。例如,在上面的文件中,使用插件的小程序做了如下导出:
代码语言:javascript复制// index.js
module.exports = { whoami: 'MiniProgram' }
那么插件就可以获得上面导出的内容:
代码语言:javascript复制// plugin
requireMiniProgram().whoami // 'MiniProgram'
具体导出什么内容,可以阅读插件开发文档,和插件的开发者做好约定。
当插件在分包中时,这个特性也可以使用,但指定的文件的路径是相对于分包的。例如在 root: packageA 的分包中指定了 export: exports/plugin.js,那么被指定的文件在文件系统上应该是 /packageA/exports/plugin.js。
使用的多个插件的导出互不影响,两个插件可以导出同一个文件,也可以是不同的文件。但导出同一个文件时,如果一个插件对导出内容做了修改,那么另一个插件也会被影响,请注意这一点。
10为插件提供自定义组件
有时,插件可能会在页面或者自定义组件中,将一部分区域交给使用的小程序来渲染,因此需要使用的小程序提供一个自定义组件。但由于插件中不能直接指定小程序的自定义组件路径,因此需要通过为插件指定 抽象节点(generics) 的方式来提供。
如果是插件的自定义组件需要指定抽象节点实现,可以在引用时指定:
代码语言:javascript复制<!-- miniprogram/page/index.fxml -->
<plugin-view generic:mp-view="comp-from-miniprogram" />
可以通过配置项为插件页面指定抽象组件实现。例如,要给插件名为 plugin-index 的页面中的抽象节点 mp-view 指定小程序的自定义组件 components/comp-from-miniprogram 作为实现的话:
代码语言:javascript复制{
"myPlugin": {
"provider": "插件 id",
"version": "1.0.0",
"genericsImplementation": {
"plugin-index": {
"mp-view": "components/comp-from-miniprogram"
}
}
}
}
恭喜你已经成功完成一款插件的开发或引入应用,你可以通过小程序插件为用户提供更丰富的服务。