• 扩展mpx
    • 目前已有插件
    • 开发插件
      • 基础例子
    • Fetch
      • 使用说明
      • 导入api说明
      • 请求优先级
      • 请求拦截器
      • 请求中断
      • 支持 emulateJSON
      • 支持 params
      • 自动过滤值为undefined和null的属性,其中null未转换成空字符串
    • API-PROXY
    • Usage
    • Options
    • example
      • 普通形式
      • 使用promise形式
  • Mock
    • 使用说明

    扩展mpx

    目前已有插件

    • 网络请求库fetch: @mpxjs/fetch 详细介绍 源码地址

    • 小程序api promisify:@mpxjs/promisify (已废弃,推荐使用新的api-proxy)

    • 小程序API转换及promisify:@mpxjs/api-proxy 详细介绍 源码地址

    • mock数据:@mpxjs/mock 详细介绍 源码地址

    开发插件

    mpx支持使用mpx.use使用插件来进行扩展。插件本身需要提供一个install方法或本身是一个function,该函数接收一个proxyMPX。插件将采用直接在proxyMPX挂载新api属性或在prototype上挂属性。需要注意的是,一定要在app创建之前进行mpx.use

    基础例子

    扩展: test.js

    1. export default function install(proxyMPX) {
    2. proxyMPX.newApi = () => console.log('is new api')
    3. proxyMPX
    4. .mixin({
    5. onLaunch() {
    6. console.log('app onLaunch')
    7. }
    8. }, 'app')
    9. .mixin({
    10. onShow() {
    11. console.log('page onShow')
    12. }
    13. }, 'page') // proxyMPX.injectMixins === proxyMPX.mixin
    14. // 注意:proxyMPX.prototype上挂载的属性都将挂载到组件实例(page实例、app实例上,可以直接通过this访问), 可以看mixin中的case
    15. proxyMPX.prototype.testHello = function() {
    16. console.log('hello')
    17. }
    18. }

    在app.js内使用插件

    1. import mpx from '@mpxjs/core'
    2. import test from './test'
    3. mpx.use(test)
    4. mpx.createApp({
    5. onLaunch() {
    6. mpx.newApi() // out put: "is new api"
    7. this.testHello() // output: 'hello'
    8. }
    9. })

    Fetch

    小程序request存在不限域名的并发限制,因此封装一个fetch来处理这种缺陷,能支持请求优先级,同时fetch还支持拦截器,请求取消等等

    使用说明

    1. import mpx from '@mpxjs/core'
    2. import mpxFetch from '@mpxjs/fetch'
    3. mpx.use(mpxFetch)
    4. // 第一种访问形式
    5. mpx.xfetch.fetch({
    6. url: 'http://xxx.com'
    7. }).then(res => {
    8. console.log(res.data)
    9. })
    10. mpx.createApp({
    11. onLaunch() {
    12. // 第二种访问形式
    13. this.$xfetch.fetch({url: 'http://test.com'})
    14. }
    15. })

    导入api说明

    mpx-fetch提供了一个实例 xfetch ,该实例包含以下api

    • fetch(config, priority), 正常的promisify风格的请求方法, priority表示请求优先级(normal,low),默认为normal
    • addLowPriorityWhiteList(rules), 按域名规则设置低优先级请求的白名单,接收一个参数,可以是字符串,也可以是正则表达式,也可以是数组 (如果fetch传入了第二个参数,那么无视这个白名单)
    • CancelToken,实例属性,用于创建一个取消请求的凭证。
    • create(), 用于创建一个新的mpx-fetch实例
    • interceptors,实例属性,用于添加拦截器,包含两个属性,request & response

    请求优先级

    1. mpx.xfetch.fetch({
    2. url: 'http://xxx.com',
    3. data: {
    4. name: 'test'
    5. }
    6. }, 'low')
    7. // or addSignWhiteList
    8. mpx.xfetch.addLowPriorityWhiteList('http://xxx.com')

    请求拦截器

    1. mpx.xfetch.interceptors.request.use(function(config) {
    2. console.log(config)
    3. // 也可以返回promise
    4. return config
    5. })
    6. mpx.xfetch.interceptors.response.use(function(res) {
    7. console.log(res)
    8. // 也可以返回promise
    9. return res
    10. })

    请求中断

    1. const cancelToken = new mpx.xfetch.CancelToken()
    2. mpx.xfetch.fetch({
    3. url: 'http://xxx.com',
    4. data: {
    5. name: 'test'
    6. },
    7. cancelToken: cancelToken.token
    8. })
    9. cancelToken.exec('手动取消请求') // 执行后请求中断,返回abort fail

    支持 emulateJSON

    1. mpx.xfetch.fetch({
    2. url: 'http://xxx.com',
    3. method: 'POST',
    4. data: {
    5. name: 'test'
    6. },
    7. emulateJSON: true // 等价于header = {'content-type': 'application/x-www-form-urlencoded'}
    8. })

    支持 params

    1. mpx.xfetch.fetch({
    2. url: 'http://xxx.com',
    3. params: {
    4. name: 'test'
    5. }
    6. })
    7. mpx.xfetch.fetch({
    8. url: 'http://xxx.com',
    9. method: 'POST',
    10. params: {
    11. age: 10
    12. },
    13. data: {
    14. name: 'test'
    15. },
    16. emulateJSON: true // 等价于header = {'content-type': 'application/x-www-form-urlencoded'}
    17. })

    自动过滤值为undefined和null的属性,其中null未转换成空字符串

    API-PROXY

    convert API at each end 各个平台之间 api 进行转换

    Usage

    1. // 使用 mpx 生态
    2. import mpx from '@mpxjs/core'
    3. import apiProxy from '@mpxjs/api-proxy'
    4. mpx.use(apiProxy, options)
    1. // 单独使用
    2. import apiProxy from '@mpxjs/api-proxy'
    3. apiProxy(target, options) // target 为要抹平的对象

    Options

    参数名称 类型 含义 是否必填 默认值 备注
    platform Object 各平台之间的转换 { from:’’, to:’’ } 使用 mpx 脚手架配置会自动进行转换,无需配置
    exclude Array(String) 跨平台时不需要转换的 api -
    usePromise Boolean 是否将 api 转化为 promise 格式使用 false -
    whiteList Array(String) 强行转化为 promise 格式的 api [] 需要 usePromise 设为 true

    example

    普通形式

    1. import mpx from '@mpxjs/core'
    2. import apiProxy from '@mpxjs/api-proxy'
    3. mpx.use(apiProxy, {
    4. exclude: ['showToast'] // showToast 将不会被转换为目标平台
    5. })
    6. mpx.showModal({
    7. title: '标题',
    8. content: '这是一个弹窗',
    9. success (res) {
    10. if (res.cancel) {
    11. console.log('用户点击取消')
    12. }
    13. }
    14. })

    使用promise形式

    1. import mpx from '@mpxjs/core'
    2. import apiProxy from '@mpxjs/api-proxy'
    3. mpx.use(apiProxy, {
    4. usePromise: true
    5. })
    6. mpx.showActionSheet({
    7. itemList: ['A', 'B', 'C']
    8. })
    9. .then(res => {
    10. console.log(res.tapIndex)
    11. })
    12. .catch(err => {
    13. console.log(err)
    14. })

    Mock

    mock数据生成规则同mockjs

    使用说明

    1. import mock from '@mpxjs/mock'
    2. // rule 为字符串或正则表达式
    3. mock([{
    4. url: 'http://api.example.com',
    5. rule: {
    6. 'list|1-10': [{
    7. 'id|+1': 1
    8. }]
    9. }
    10. }])