小程序插件
1. 插件介绍
请注意
插件功能需要在基础库版本≥2.11.1,SDK版本≥2.34.0的环境下才可使用
插件,是可被添加到小程序内直接使用的功能组件。小程序开发者可直接在小程序内使用插件,无需重复开发,为用户提供更丰富的服务。
开发者可在小程序代码中引入插件代码的声明,然后在使用 FIDE 开发工具进行编译时, FIDE 会从服务端获取插件代码一起进行打包编译。
1.1 添加插件
在使用插件前,开发者可登录「小程序开放平台-小程序管理-小程序插件」,通过插件 ID 查找插件并添加。
1.2 引入插件代码包
使用插件前,使用者要在 app.json 中声明需要使用的插件,例如:
代码示例
{
"plugins": {
"myPlugin": {
"version": "1.0.0",
"provider": "插件 id"
}
}
}
如上例所示, plugins
定义段中可以包含多个插件声明,每个插件声明以一个使用者自定义的插件引用名作为标识,并指明插件的 ID
和需要使用的版本号。
其中,引用名(如上例中的 myPlugin)由使用者自定义,无需和插件开发者保持一致或与开发者协调。在后续的插件使用中,该引用名将被用于表示该插件。
1.3 在分包内引入插件代码包
如果插件只在一个分包内用到,可以将插件仅放在这个分包内,例如:
{
"subpackages": [
{
"root": "packageA",
"pages": [
"pages/cat",
"pages/dog"
],
"plugins": {
"myPlugin": {
"version": "1.0.0",
"provider": "插件 id"
}
}
}
]
}
在分包内使用插件有如下限制:
- 仅能在这个分包内使用该插件;
- 同一个插件不能被多个分包同时引用;
1.4 使用插件
使用插件时,插件的代码对于使用者来说是不可见的。为了正确使用插件,使用者应查看插件详情页面中的“开发文档”一节,阅读由插件开发者提供的插件开发文档,通过文档来明确插件提供的自定义组件、页面名称及提供的 js 接口规范等。
1.5 自定义组件
使用插件提供的自定义组件,和 使用普通自定义组件 的方式相仿。在 json 文件定义需要引入的自定义组件时,使用 plugin://
协议指明插件的引用名和自定义组件名,例如:
代码示例
{
"usingComponents": {
"hello-component": "plugin://myPlugin/hello-component"
}
}
出于对插件的保护,插件提供的自定义组件在使用上有一定的限制:
- 默认情况下,页面中的 this.selectComponent 接口无法获得插件的自定义组件实例对象;
- ft.createSelectorQuery 等接口的 >>> 选择器无法选入插件内部。
1.6 页面
需要跳转到插件页面时,url 使用 plugin://
前缀,形如 plugin://PLUGIN_NAME/PLUGIN_PAGE, 如:
代码示例
<navigator url="plugin://myPlugin/hello-page">
Go to pages/hello-page!
</navigator>
1.7 js 接口
使用插件的 js 接口时,可以使用 requirePlugin
方法。例如,插件提供一个名为 hello 的方法和一个名为 world 的变量,则可以像下面这样调用:
var myPluginInterface = requirePlugin('myPlugin');
myPluginInterface.hello();
var myWorld = myPluginInterface.world;
也可以通过插件的 id 来获取接口,如:
var myPluginInterface = requirePlugin('插件 id');
1.8 导出到插件
使用插件的小程序可以导出一些内容,供插件获取。具体来说,在声明使用插件时,可以通过 export
字段来指定一个文件,如:
{
"myPlugin": {
"version": "1.0.0",
"provider": "插件 id",
"export": "index.js"
}
}
则该文件(上面的例子里是 index.js)导出的内容可以被这个插件用全局函数获得。例如,在上面的文件中,使用插件的小程序做了如下导出:
// index.js
module.exports = { whoami: 'MiniProgram' }
那么插件就可以获得上面导出的内容:
// plugin
requireMiniProgram().whoami // 'MiniProgram'
具体导出什么内容,可以阅读插件开发文档,和插件的开发者做好约定。
当插件在分包中时,这个特性也可以使用,但指定的文件的路径是相对于分包的。例如在 root: packageA 的分包中指定了 export: exports/plugin.js,那么被指定的文件在文件系统上应该是 /packageA/exports/plugin.js。
使用的多个插件的导出互不影响,两个插件可以导出同一个文件,也可以是不同的文件。但导出同一个文件时,如果一个插件对导出内容做了修改,那么另一个插件也会被影响,请注意这一点。
1.9 为插件提供自定义组件
有时,插件可能会在页面或者自定义组件中,将一部分区域交给使用的小程序来渲染,因此需要使用的小程序提供一个自定义组件。但由于插件中不能直接指定小程序的自定义组件路径,因此需要通过为插件指定 抽象节点(generics) 的方式来提供。
如果是插件的自定义组件需要指定抽象节点实现,可以在引用时指定:
<!-- miniprogram/page/index.fxml -->
<plugin-view generic:mp-view="comp-from-miniprogram" />
可以通过配置项为插件页面指定抽象组件实现。例如,要给插件名为 plugin-index 的页面中的抽象节点 mp-view 指定小程序的自定义组件 components/comp-from-miniprogram 作为实现的话:
{
"myPlugin": {
"provider": "插件 id",
"version": "1.0.0",
"genericsImplementation": {
"plugin-index": {
"mp-view": "components/comp-from-miniprogram"
}
}
}
}
2. 单向视频录制插件
2.1 快速开始
// pages/video/video.js
Page({
data: {
recordTime: 30000,
top: 20,
stepList: [
{
audioSrc: 'https://devtest-1252553964.cos.ap-guangzhou.myqcloud.com/1.mp3',
showTime: 0,
textList: [{
text: '第一行文本',
margin: '0 0 6rpx 0'
}, {
text: [{
text: '第二行'
}, {
text: '高亮高亮',
color: '#ee6f2d',
fontWeight: 'bold',
margin: '0 6rpx'
}, {
text: '文本文本文本文本文本'
}]
}, {
text: '第三行文本文本文本文本文本',
color: '#ee6f2d',
margin: '6rpx'
}]
},
{
audioSrc: 'https://devtest-1252553964.cos.ap-guangzhou.myqcloud.com/2.mp3',
showTime: 8000,
textList: [{
text: '第二个文本',
margin: '0 0 6rpx 0'
}, {
text: [{
text: '文本'
}, {
text: '高亮',
color: '#ee6f2d',
fontWeight: 'bold',
margin: '0 6rpx'
}, {
text: '文本文本文本文本文本'
}, {
text: '高亮',
color: '#ee6f2d',
fontWeight: 'bold',
margin: '0 6rpx'
}]
}]
},
{
audioSrc: 'https://devtest-1252553964.cos.ap-guangzhou.myqcloud.com/3.mp3',
showTime: 18000,
textList: [{
text: '3第三个文本',
margin: '0 0 6rpx 0'
}, {
text: [{
text: '3第二行'
}, {
text: '3高亮3',
color: '#ee6f2d',
fontWeight: 'bold',
margin: '0 6rpx'
}, {
text: '333文本文本文本文本文本文本333'
}]
}]
}
],
buttonStyle: {
width: '16vw',
height: '16vw',
bottom: '80rpx'
}
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
wx.showLoading()
},
onRecordReady() {
wx.hideLoading()
},
onRecordStart() {
wx.showToast({
title: '录制开始',
icon: 'none'
})
},
onRecordEnd(res) {
const { tempVideoPath } = res.detail
wx.showToast({
title: '录制结束,地址:' + tempVideoPath,
icon: 'none'
})
setTimeout(() => {
wx.navigateTo({
url: '/pages/index/index?url=' + encodeURIComponent(tempVideoPath)
})
}, 3500)
},
onRecordError(res) {
const { errMsg } = res.detail
wx.showToast({
title: errMsg,
icon: 'none'
})
}
})
// pages/video/video.json
"usingComponents": {
"video-recognition": "plugin://video/video-recognition"
}
// pages/video/video.fxml
<view style="width: 100vw;height: 100vh;">
<video-recognition recordTime="{{recordTime}}"
top="{{top}}"
stepList="{{stepList}}"
buttonStyle="{{buttonStyle}}"
mask="/assets/img_mask_person@3x.png"
resolution="low"
bind:onRecordReady="onRecordReady"
bind:onRecordStart="onRecordStart"
bind:onRecordEnd="onRecordEnd"
bind:onRecordError="onRecordError">
</video-recognition>
</view>
2.2 参数
属性 | 类型 | 是否必传 | 默认值 | 说明 |
---|---|---|---|---|
resolution | String | 否 | medium | 分辨率,可选值:low、medium、high 只在初始化时有效,不能动态变更 |
mask | String | 否 | - | 取景区域的遮罩资源路径,建议使用小程序内资源的相对路径,https 地址会有加载耗时, 遮罩会按 width 100% height 100% 的尺寸放在 camera 上,注意和组件尺寸相匹配 |
recordTime | Number | 否 | 30000 | 录制时间,单位为毫秒 |
top | Number | 否 | 20 | 单位 rpx 文本提示距顶部的距离, 也可修改 video-recognition 组件内的 wxss,自定义文本的 position |
stepList | Array[Object] | 否 | - | 见下方 |
buttonStyle | Object | 否 | - | 控制录制按钮的样式,可对按钮进行位置上的微调目前仅支持以下字段:width、height、left、top、bottom、right 只在初始化时有效,不能动态变更 |
onRecordReady | EventHandler | 否 | - | 通过 onRecordReady 绑定 ready 前会进行一些异步资源的下载,资源准备好后触发可用于使用组件的 page 页面判断是否准备完毕,从而控制 loading 展示 |
onRecordStart | EventHandler | 否 | - | 通过 bind:onRecordStart 绑定录制开始时触发 |
onRecordEnd | EventHandler | 否 | - | 通过 bind:onRecordEnd 绑定录制结束时触发回调方法参数 res:tempVideoPath 录制视频的本地文件地址 |
onRecordError | EventHandler | 否 | - | 通过 bind:onRecordError 绑定录制报错时触发回调方法参数 res:errMsg 发生错误时的报错信息 |
setpList
每步的语和提示案配置,最大支持长度为 3 数据元素结构如下:
{
"audioSrc": "https://xxxxx.mp3",
"showTime": 0,
"textList": []
}
audioSrc - 音频链接,建议使用 https 链接,组件 attached 会下载音频资源,若下载失败会执行 error 回调,报资源加载错误(注意:mp3 的域名需在管理后台添加到白名单内,否则会下载失败) showTime - 文本提示和音频的展示时间,毫秒数,0 表示初始展示,2000 表示录制开始 2s 时展示 textList - 文本提示,数组类型
textList 参数对象如下:
{
"text": '请用普通话大声朗读'
}
text - 文本内容 可添加 width|height|padding|margin|color|fontSize|fontWeight|textAlign 等样式属性简单控制文本样式:
{
"text": "文本",
"color": "red",
"fontWeight": "bold",
"margin": "0 20rpx"
}
注意,一个 textList 子元素,展示时会以单行不换行展示,可按需拆分成多行多个子元素; 另外,如果单行内容内需要个别词语高亮展示,text 属性可以传入数组,属性与上述对象参数一致,如下:
{
"text": [{
"text": "文本"
}, {
"text": "高亮文本",
"color": "red",
"fontWeight": "bold",
"margin": "0 20rpx"
}, {
"text": "文本"
}]
}
只在初始化时有效,不能动态变更
3. 虚拟键盘插件
3.1 快速开始
// component.json
"usingComponents": {
"keyboard": "plugin://virtual-keyboard/keyboard"
}
// wxml
<keyboard show="{{ show }}" closeButtonText="完成" bindinput="changeInput" binddelete="changeDetete" />
3.2 参数
属性 | 类型 | 默认值 | 说明 |
---|---|---|---|
title | string | 键盘上方显示的标题 | |
show | boolean | false | 控制键盘是否显示 |
theme | string | default | default/custom 当为 custom 时右侧增加删除和完成按钮 |
themeColor | string | #2e7cff | 设置主题色 |
zIndex | number/string | 999 | 层级 |
isRandomLetter | boolean | false | 乱序字符 |
isRandomNumber | boolean | false | 乱序数字 |
normalType | string | number | number/letter/symbol 控制显示的键盘类型 |
closeButtonText | string | 关闭按钮的文字 | |
extraKey | [string] | 额外的按键 | |
icon | string | 标题栏 icon 的路径 |