uniapp体系开发微信小程序插件

一、开发背景

小程序模块部分业务需要被多方小程序使用。显然小程序插件是符合业务需求的,但是uniapp体系没有直接开发小程序插件的能力,在一番探索之后发现 uniapp2wxpack 比较符合我们的期望。

二、开发准备(以下内容为 uni-project-to-plugin README.md 的细节补充)

注意

项目中涉及appid的部分需要自己修改成项目的实际appid,否则无法开发插件

第一步

通过命令的方式创建 uniapp 项目 (只能通过命令创建方式构建)

npm install -g @vue/cli
vue create -p dcloudio/uni-preset-vue my-project
第二步

运行uniapp2wxpack-cli(uniapp2wxpack 3.0以上版本)

npx uniapp2wxpack --create 

运行完之后,项目同时具备uni-app 解耦模式 的开发和 插件开发 能力 ( 这里只关注插件开发 )
1、package.json scripts 中会自动生成以下命令

scripts: {
  build:mp-weixin-pack: '***',
  dev:mp-weixin-pack: '***',
  build:mp-weixin-pack-plugin: '***',
  dev:mp-weixin-pack-plugin: '***'
}

2、根目录自动创建文件 projectToSubPackageConfig.js ( 不用修改 )
3、根目录自动创建目录mainWeixinMp ( 此目录打包后会成为 miniprogram 目录, 对应插件开发模式的预览页面
4、mainWeixinMp文件下自动创建app.js文件

mainWeixinMp: 此文件内容为插件运行模式下的调试页面 ( 这里只关注插件开发 )
1、手动添加 pages文件夹
2、添加文件 pages/app.json
3、添加文件 pages/myTest/index.js,pages/myTest/index.json, pages/myTest/index.wxml,pages/myTest/index.wxss

pages/app.json
// pages/myTest/index.json
{
  "pages": [
    "pages/myTest/index"
  ],
  "subPackages": [],
  "usingComponents": {},
  "plugins": {
    "custom-plugin": {
      "version": "dev",
      "provider": "{{appid}}" // 请填写真实的appid
    }
  }
}

pages/myTest/index.js
// pages/myTest/index.js
var customPlugin = requirePlugin("custom-plugin");
console.log('customPlugin', customPlugin)
Page({
  // 页面的初始数据
  data: {},
  // 生命周期函数--监听页面加载
  onLoad: function (options) {},
  // 生命周期函数--监听页面初次渲染完成
  onReady: function () {},
  // 生命周期函数--监听页面显示
  onShow: function () {},
  // 生命周期函数--监听页面隐藏
  onHide: function () {},
  // 生命周期函数--监听页面卸载
  onUnload: function () {},
  // 页面相关事件处理函数--监听用户下拉动作
  onPullDownRefresh: function () {},
  // 页面上拉触底事件的处理函数
  onReachBottom: function () {},
  // 用户点击右上角分享
  onShareAppMessage: function () {}
})
pages/myTest/index.json
// pages/myTest/index.json
{
  "usingComponents": {
    "componentButton": "plugin://custom-plugin/componentButton"
  }
}
pages/myTest/index.wxml
<!--pages/myTest/index.wxml-->
<view class="test-page">
  <text class="title">小程序调试页</text>
  <view>
    <text class="title">跳转到插件page index示例</text>
    <navigator url="plugin-private://{{appid}}/pages/index/index">
      <button type="primary" size="mini">custom-plugin/pages/index/index</button>
    </navigator>
  </view>
  <view>
    <text class="title">跳转到插件page test</text>
    <navigator url="plugin-private://{{appid}}/pages/test/index">
      <button type="primary" size="mini">custom-plugin/pages/test/index</button>
    </navigator>
  </view>
  <view>
    <text class="title">组件示例 button</text>
    <customButton/>
  </view>
</view>
pages/myTest/index.wxss
/* pages/myTest/index.wxss */
.test-page{
  padding: 30rpx;
}
.title{
  font-size: 40rpx;
  text-align: center;
  display: block;
  padding: 20rpx;
}

第三步

手动在项目根目录创建插件开发需要的project.config.json,并且内容miniprogramRoot和pluginRoot属性按以下填写
并且自行填写真实的appid

{
    "miniprogramRoot": "miniprogram/",
    "pluginRoot": "uniSubpackage/",
    "compileType": "plugin",
    "setting": {},
    "appid": "xxxxxxxxx", // 请填好真实的appid
    "projectname": "uniapp2wxpack开发微信小程序插件",
    "simulatorType": "wechat",
    "simulatorPluginLibVersion": {},
    "condition": {}
}
第四步

在src目录下手动创建plugin.json
并且main属性必须按以下内容填写,也就意味着插件的接口文件指向src/main.js(因为打包后路径会变成common/main.js)

{
    "publicComponents": {
        "customButton": "components/custom-button/index"
    },
    "pages": {
        "page-index": "pages/index/index",
        "page-test": "pages/test/index"
    },
    "main": "common/main.js"
}
第五步

对src/main.js进行js接口的设置(非必须)
在main.js的最底部填写相关需要的内容
其中如果需要对第三方小程序公开自定义组件的使用,需要定义vue的全局组件,见如下范例
插件的接口使用特殊的API __uniPluginExports进行暴露

import Vue from 'vue'
import App from './App'

Vue.config.productionTip = false

App.mpType = 'app'

const app = new Vue({
  ...App
})
app.$mount()


/**
 * 要输出给第三方小程序使用的自定义组件,必须声明全局组件
 * 如果只是单纯的引入,不声明全局组件,build模式会无法正常输出组件
 * 补充:需要在src下自己添加组件目录
 */
import customButton from './components/custom-button'
Vue.component('customButton',customButton)


// 插件接口输出使用特殊的API
// 用来给引用的小程序使用的
__uniPluginExports = {
    hello: function() {
        console.log('Hello plugin!')
    }
}
第六步

运行命令

npm run dev:mp-weixin-pack-plugin (开发模式)
npm run build:mp-weixin-pack-plugin (生产模式)
第七步

使用微信开发者工具预览dist目录下相关环境的 mp-weixin-pack-plugin 目录( 注意不要选择错了 )

home.png

custom-plugin-test-page.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容