支付宝小程序插件 插件使用

2020-09-18 14:28 更新

插件使用有两种方式:静态声明方式 和 动态加载方式。

前提条件

  • 使用插件前请完成 订购插件
  • 如果主体小程序使用了 分包,支付宝 10.1.85 版本及以上支持使用插件
  • 不支持一个小程序关联 10 个及以上插件
  • 不支持较早版本的 APPID 为 8 位数字的小程序

静态声明

插件使用声明

使用插件前,使用者需要在 app.json 中声明需要使用的插件,示例代码如下:

  1. {
  2. "plugins": {
  3. "myPlugin": {
  4. "version": "*", // 目前只支持设置 * 拉取当前上架最新版本
  5. "provider": "2019235609092837"
  6. },
  7. //如需声明多个插件,重复添加自定义字段即可
  8. "yourPlugin": {
  9. "version": "*", // 目前只支持设置 * 拉取当前上架最新版本
  10. "provider": "2019235609090000"
  11. }
  12. }
  13. }
  • plugins:可以声明多个插件,每个插件声明以使用者自定义的插件引用名作为唯一标识;

  • version:指定插件版本号;

  • provider:指定所引用的插件 ID(插件 ID 可咨询插件提供方)。

说明:provider 属性值建议使用 {{currentPluginId}} 动态 APPID。

注意:

  • 插件引用名(如以上示例中的 myPlugin)由插件使用者自定义,无需和插件开发者的命名保持一致。在后续的插件使用中,该引用名将被用于表示该插件。
  • version 目前只支持设置 ***** 拉取当前上架最新版本。
  • 同一个插件 ID 不能多次声明使用。

使用插件

版本兼容

使用插件的小程序项目需要 0.60 或以上版本的 IDE 才能编译构建。

插件的运行要求小程序基础库为 1.22.4 及以上版本,支付宝客户端 10.1.85 及以上的版本,小程序在使用插件的时候,需要按照如下方式兼容:

  1. // app.js
  2. if (!my.canIUse('plugin') && !my.isIDE) {
  3. my.ap && my.ap.updateAlipayClient && my.ap.updateAlipayClient();
  4. }
  5. App({
  6. onLaunch() {},
  7. onShow() {},
  8. })

注意:兼容代码一定要放到 app.js 文件的开头处,不能放到生命周期方法中,如果不做上述兼容处理,在基础库版本低于 1.18.0 的时候可能会导致页面白屏。

组件

可使用 基础组件扩展组件自定义组件,插件的自定义组件和普通的自定义组件使用方法类似。在 json 文件中定义需要引用的插件自定义组件时,通过 plugin:// 协议指明需要引用的插件自定义组件,如下所示:

  1. {
  2. "usingComponents": {
  3. "hello": "plugin://myPlugin/hello"
  4. }
  5. }

出于对插件的保护,插件提供的自定义组件在使用上有一定的限制:默认情况下 ref 接口无法获得插件的自定义组件实例对象。可以通过给插件自定义组件定义 ref 定义段的方式 指定被 ref 引用时的返回值。

页面

跳转到插件页面时, URL 使用 plugin:// 前缀,格式为 plugin://PLUGIN_NAME/PLUGIN_PAGE,如下所示:

  1. <navigator url="plugin://myPlugin/hello">
  2. Go to pages/hello page!
  3. </navigator>

也可以使用 API 进行跳转

  1. my.navigateTo({
  2. url: 'plugin://myPlugin/hello',
  3. })

js 接口

使用插件的 js 接口时,可以使用 requirePlugin 方法。

该示例先通过 requirePlugin 引用插件 API,然后访问插件暴露的 helloApi 函数以及 world 变量。

  1. const myPlugin = requirePlugin('myPlugin');
  2. myPlugin.helloApi();
  3. const word = myPlugin.world;

动态加载

为了给开发者提供更好的体验,我们提供了动态加载插件的方式,不用在 app.json 中声明插件依赖,而是使用 my.loadPlugin 动态加载插件。这样小程序不用启动阶段就下载插件包,而是等到使用时,再下载插件包,可以有更好的性能体验。

动态加载插件使用声明

使用动态加载插件前,需要在 app.json 中做如下声明

  1. {
  2. "useDynamicPlugins": true
  3. }

注意:只有加了以上声明,才可以使用动态加载插件的方式。

使用插件

版本兼容

使用动态加载插件的小程序项目需要 1.0 或以上版本的 IDE 才能编译构建。

插件的运行要求小程序基础库为 1.21.0 及以上版本,小程序在动态加载插件的时候,需要按照如下方式兼容:

  1. // app.js
  2. if (!my.canIUse('plugin.dynamic') && !my.isIDE) {
  3. my.ap && my.ap.updateAlipayClient && my.ap.updateAlipayClient();
  4. }
  5. App({
  6. onLaunch() {},
  7. onShow() {},
  8. })

使用 my.loadPlugin 动态加载插件

在使用插件的组件、页面或 API 之前,需要使用 my.loadPlugin 动态加载插件,如下所示

  1. Page({
  2. data: {
  3. isReady: false,
  4. },
  5. onLoad() {
  6. my.loadPlugin({
  7. plugin: '2019235609092837@*', // 指定要加载的插件id和版本号,为*则每次拉取最新版本
  8. success: () => {
  9. const plugin = requirePlugin('dynamic-plugin://2019235609092837');
  10. plugin.helloApi(); // 调用插件api
  11. this.setData({ isReady: true }); // 插件已加载,可以渲染插件组件了
  12. },
  13. });
  14. },
  15. navToPluginPage() {
  16. // 跳转到插件页面,hello为插件plugin.json中对外暴露的页面
  17. my.navigateTo({
  18. url: 'dynamic-plugin://2019235609092837/hello'
  19. })
  20. }
  21. })

  1. <!-- 使用 component 组件 渲染插件组件 hellohello为插件plugin.json中对外暴露的组件 -->
  2. <component is="dynamic-plugin://2019235609092837/hello" a:if="{{isReady}}">
  3. <view>hello</view>
  4. </component>
  5. <navigator url="dynamic-plugin://2019235609092837/hello">使用navigator组件跳转到插件页面</navigator>
  6. <button onTap="navToPluginPage">跳转到插件页面</button>

自定义组件

动态渲染自定义组件,需要使用 component 组件。

属性

属性名 类型 描述
is String 要渲染的插件组件。需要使用dynamic-plugin: 前缀

注意:

  1. 需要使用 dynamic-plugin: 指定要渲染的插件组件,格式为 dynamic-plugin:/PLUGIN_ID/PLUGIN_COMPONENT。PLUGIN_COMPONENT 为插件 plugin.json 中对外暴露的组件。
  2. 必须使用 a:if 控制 component 组件是否可以渲染。否则可能导致白屏。
  3. 可以像使用自定义组件一样使用 component 组件,component 组件会将其props都传递给所要渲染的插件组件。
  4. 默认情况下 ref 接口无法获得插件的自定义组件实例对象。可以通过给插件自定义组件定义 ref 定义段的方式 指定被 ref 引用时的返回值

示例代码

  1. <component
  2. is="dynamic-plugin://2019235609092837/hello"
  3. onComMount="onComMount"
  4. name="xiaoming"
  5. ref="saveRef"
  6. a:if="{{isReady}}"
  7. >
  8. <view>hello</view>
  9. </component>
  1. Page({
  2. data: {
  3. isReady: false,
  4. },
  5. onLoad() {
  6. my.loadPlugin({
  7. plugin: '2019235609092837@*',
  8. success() {
  9. this.setData({ isReady: true });
  10. },
  11. })
  12. },
  13. onComMount() {
  14. console.log('dynamic-plugin://2019235609092837/hello is mounted')
  15. },
  16. saveRef(ref) {
  17. console.log(ref);
  18. },
  19. })

页面

跳转到插件页面,需要使用 dynamic-plugin: 前缀。格式为 dynamic-plugin:/PLUGIN_ID/PLUGIN_PAGE,其中PLUGIN_PAGE 为插件 plugin.json 中暴露的页面。如下所示

  1. <navigator url="dynamic-plugin://2019235609092837/hello">
  2. Go to pages/hello page!
  3. </navigator>

也可以使用 API 进行跳转

  1. my.loadPlugin({
  2. plugin: '2019235609092837@1.2.3',
  3. success() {
  4. my.navigateTo({
  5. url: 'dynamic-plugin://2019235609092837/hello',
  6. });
  7. },
  8. });

注意:跳转页面前需要确保插件已加载。

js 接口

使用插件的 js 接口时,可以使用 requirePlugin 方法,但需要使用 dynamic-plugin: 前缀。格式为: dynamic-plugin://PLUGIN_ID,如下所示

  1. Page({
  2. onLoad() {
  3. my.loadPlugin({
  4. plugin: '2019235609092837@*',
  5. success() {
  6. const myPlugin = requirePlugin('myPlugin');
  7. myPlugin.helloApi();
  8. const word = myPlugin.world;
  9. },
  10. })
  11. },
  12. })
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号