插件创建成功后,可下载IDE开始开发插件。
注意:
1)插件 acss 文件中,基本选择器只支持 ID 与 class 选择器,不支持标签、属性、通配符选择器;
2)如需获取宿主 appId,可以通过 my.getParentAppIdSync() 进行调用;
3)不支持使用 【getApp】 方法 获取当前 app 实例;
4)不支持通过 【getCurrentPages】 方法 获取小程序的页面信息;
5)不支持在插件内使用 web-view 组件。
新建插件类型的示例项目中包含如下目录, 小程序代码目录可以当成普通小程序来编写。
1)plugin目录: 插件代码目录,用于编写小程序插件代码;
2)client目录:插件本身不能独立运行,client目录做为测试小程序插件Demo,用于插件开发调试、插件版本上传做为版本审批依据;
3)client.app.json: 在研发插件时,version默认dev。
{ "plugins": { "myPlugin": { "version": "dev", //注:固定dev 对于插件研发默认指定dev版本 "provider": "{{currentPluginId}}" // 建议使用"{{currentPluginId}}",研发插件则为插件ID } } }
mini.project.json文件:
{ "miniprogramRoot": "client", "pluginRoot": "plugin", "compileType": "plugin", "appid": "300000000xxxxxx" //填写当前关联插件ID }
插件可以包含若干个 自定义组件、页面和一组 js 接口。插件 plugin 文件夹中的示例目录内容如下:
plugin |-----components // 插件提供的自定义组件(可以有多个) |----------hello-component | |----hello-component.acss | |----hello-component.axml | |----hello-component.js | |----hello-component.json |-----pages // 插件提供的页面(可以有多个) |----------hello-page | |----hello-page.acss | |----hello-page.axml | |----hello-page.js | |----hello-page.json |----------index | |----index.acss | |----index.axml | |----index.js | |----index.json |-----index.js // 插件的 js 接口 |-----plugin.json // 插件配置文件
向第三方小程序开放的所有组件、页面和 js 接口都必须在 plugin.json 中声明,格式如下:
{ "publicComponents": { "hello-component": "components/hello-component" }, "publicPages": { "hello-pages": "pages/hello-page" }, "pages": [ "pages/hello-page" "pages/index" ], "main": "index.js" }
每个配置的含义如下:
1)publicComponents:列出所有向小程序开放的自定义组件。
2)publicPages:列出所有向小程序开放的页面。
3)Pages:列出插件所有页面(包含向小程序开放的以及不向小程序开放的页面)。
4)main:插件面向第三方小程序的 js 接口。
打开IDE,用注册开发者的淘宝账号登录后,左侧选择【小程序项目 -插件】或是【PC小程序项目 -插件PC版】,点击 + 号新建项目,填写项目名称、项目路径,选择关联在控制台创建的插件后进入项目。
插件可以定义若干个自定义组件,这些组件在插件内是可以互相引用的,但是如果想要第三方小程序可以使用,就必须在 plugin.json 中列出,具体见上文【插件配置】。
插件自定义组件和普通自定义组件一样,每个自定义组件由 axml、acss、js以及json四个文件组成,具体参见【自定义组件文档】。
插件也可以定义若干个自定义页面,可以从本插件的自定义组件、其他页面或者第三方小程序中跳转。其中,提供给第三方小程序跳转的页面必须在plugin.json中列出。publicPages 和 pages 都需要配置。
插件页面也和普通小程序的页面一样,每个页面由 axml、acss、js以及json四个文件组成,具体参见【页面文档】。
插件执行页面跳转的时候,可以使用 navigator 组件或者 my.navigateTo。使用时有如下注意事项:
1)不支持跳转到小程序页面;
2)不支持使用 my.switchTab, 其他api可以正常使用;
3)不支持插件作为首页;
插件可以在接口文件中 export 一些 js 接口,供插件的使用者调用,如:
export default { helloApi: function() { console.log('helloApi!') } }
点击 IDE 中右上角 真机调试 或 预览 按钮查看效果。
完成开发后点击界面右上角 上传。完成插件上传后,可进入 【淘宝开放平台】 对插件进行管理,如插件提审、插件联调;
插件不支持直接使用其他插件。如果小程序引用了多个插件,插件之间可以互相调用但不可以互相跳转。
例如,第三方小程序中的 app.json 。
{ "plugins": { "pluginOne": { "version": "1.0.0", "provider": "2019081209098989" }, "pluginTwo": { "version": "1.0.0", "provider": "2019081209091212" } } }
上面的示例中,第三方小程序通过 app.json 引用了两个插件,那么插件 pluginOne 可以通过以下三种方式访问 pluginTwo 的组件、页面以及 js 接口:
1)在 json 文件中 配置 plugin://pluginTwo/hello 来引用插件 pluginTwo 的自定义组件;
2)requirePlugin('pluginTwo') 的方式来引用插件 pluginTwo 暴露的 js 接口。
getCurrentPages 用于返回当前页面栈,返回过程中存在如下限制:
1)插件页中调用该方法无法获取小程序页面栈信息,即对应的小程序页面在获取的页面栈中值为 null;
2)小程序页中调用该方法无法获取插件页面栈信息,即对应的插件页面在获取的页面栈中值为 null。
例如当前的页面栈从栈底到栈顶依次为:小程序页面 A、小程序页面 B、插件页面 C、插件页面 D
在小程序页中调用 getCurrentPages 方法返回页面栈:
// PageA/PageB 为小程序页面实例 [PageA, PageB, null, null]
在插件页中调用 getCurrentPages 方法返回页面栈:
// PageC/PageD 为插件页面实例 [null, null, PageC, PageD]
出于安全性考虑,插件不支持随意跳转至小程序的页面。如有相关需求,可以将跳转方式包装成方法,通过插件暴露的 API,传递给插件,插件内部可以通过这些方法实现跳转。详情请下载 插件跳转小程序页面示例 压缩包。