mpvue開發(fā)音頻類小程序踩坑和建議 fengxianqi

前言

這是我第一次開發(fā)小程序辣恋,開發(fā)的產(chǎn)品是音頻類的,在大佬的建議下采用了mpvue,一周時(shí)間把功能都做出來晴玖,由于不太熟悉mpvue和微信小程序炬守,足足用了一周時(shí)間來改bug才出來一個(gè)能用的版本眠菇,在這里整理分享下我開發(fā)時(shí)遇到的一些問題和給出一些建議。

image

Linux上開發(fā)小程序

在公司電腦裝了雙系統(tǒng)慈缔,日常用的是Ubuntu系統(tǒng)叮称,Linux或Mac的開發(fā)環(huán)境對(duì)前端相對(duì)來說會(huì)友好一些。微信小程序官方的開發(fā)者工具只有WindowsMac版本藐鹤,所以這就尷尬了瓤檐。

不過還好,發(fā)現(xiàn)已經(jīng)有大神在GitHub上做了Linux的支持娱节,推薦給大家:Linux微信web開發(fā)者工具挠蛉。
根據(jù)教程安裝使用即可,使用時(shí)就用./bin/wxdt命令打開肄满。不過用了幾天后面覺得不太方便谴古,就索性切回Windows系統(tǒng)用官方最新的版本了。

封裝wx.request為Promise

wx.request用于發(fā)起http請(qǐng)求稠歉,但平時(shí)習(xí)慣了Promise的寫法掰担,所以還是封裝一下這個(gè)方法為Promise的形式。
我看很多小程序會(huì)使用fly這個(gè)庫怒炸。

但個(gè)人覺得發(fā)起請(qǐng)求不需要那么強(qiáng)大的功能带饱,小程序本身就應(yīng)該是一個(gè)輕量級(jí)的東西,引入一個(gè)庫可能會(huì)導(dǎo)致項(xiàng)目打包變大阅羹,可能讓小程序更卡勺疼,所以本著能自己寫就自己寫吧的心態(tài),索性自己封裝一下算了捏鱼。

src/utils,新建一個(gè)request.js:

const apiUrl = 'https://your server.com/api/'
const request = (apiName, reqData, isShowLoading = true) => {
  // 某些請(qǐng)求可能不需要顯示loading
  if (isShowLoading) {
    wx.showLoading({
      title: '正在努力加載中',
      mask: true
    })
  }

  return new Promise(function (resolve, reject) {
    wx.request({
      url: apiUrl + apiName,
      method: 'POST',
      data: reqData,
      header: {
        'content-type': 'application/json' // 默認(rèn)值
      },
      success (res) {
        if (res.data.code === 0) {
          // 與后端約定code=0時(shí)才是正常的
          resolve(res)
        } else {
          reject(res)
        }
      },
      fail (err) {
        reject(err)
      },
      complete (res) {
        wx.hideLoading()
      }
    })
  })
}

export default request

當(dāng)然這是個(gè)簡(jiǎn)化版的恢口,我實(shí)際項(xiàng)目中還會(huì)在初始化時(shí)加入一些token之類的參數(shù),大家能看明白是這樣封裝成Promise的就可以啦穷躁。

使用vant-weapp

小程序已經(jīng)支持了npm安裝,但不太會(huì)弄。還是按網(wǎng)上方法问潭,將項(xiàng)目clone下來放進(jìn)static目錄下猿诸。

git clone https://github.com/youzan/vant-weapp.git

然后將vant-weappdist目錄拷貝到項(xiàng)目的static目錄下(盡可能精簡(jiǎn),刪掉一些奇奇怪怪的如.github的東西狡忙,所以直接使用dist目錄)梳虽,改名為vant(也可以不改名)。全局使用時(shí)灾茁,可以在app.json引入:

  "usingComponents": {
    "van-button": "/static/vant/button/index",
    "van-field": "/static/vant/field/index"
  },

注意:需要打開微信開發(fā)者工具中的ES6轉(zhuǎn)ES5功能

一開始以為使用起來和web端的沒啥差別窜觉,但沒想到那么麻煩。比如:在vue中是可以使用v-model的北专,但在mpvue中的小程序中不能使用禀挫,只能

<van-field :value="password" type="password" @change="pwdChange" input-class="myClass" />

而且不能隨意靈活添加class修改組件的樣式,需要vant組件支持提供外部樣式才可修改拓颓,比如上面的van-field是通過input-class來添加樣式控制的语婴,很不方便。而且某些內(nèi)部樣式由于沒有外部樣式表驶睦,根本改不了砰左。

綜上: 在微信小程序使用第三方組件庫不太方便,樣式修改比較麻煩场航,如果產(chǎn)品是有UI設(shè)計(jì)時(shí)缠导,盡量不使用,有時(shí)候自己實(shí)現(xiàn)樣式可能更快溉痢,而且項(xiàng)目體積更小僻造。

使用vuex

mpvue官方的快速模板中是將vuex放在counter 這個(gè)page目錄下,可能習(xí)慣了vue官方寫法的很多同學(xué)(包括我)不太喜歡适室,所以最好就改為vuex官方的寫法嫡意。

在src目錄下建一個(gè)store的文件夾,分別建以下文件:

image

項(xiàng)目不太復(fù)雜時(shí)不建議使用modules捣辆,使用起來比較麻煩蔬螟。

貼一下index.js的代碼,其他的actions.js,getters.js按官方的寫法就好啦汽畴。

import Vue from 'vue'
import Vuex from 'vuex'
import * as actions from './actions'
import * as getters from './getters'
import state from './state'
import mutations from './mutations'
import createLogger from 'vuex/dist/logger'

Vue.use(Vuex)

const debug = process.env.NODE_ENV !== 'production'

export default new Vuex.Store({
  actions,
  getters,
  state,
  mutations,
  strict: debug,
  plugins: debug ? [createLogger()] : []
})

vuex/dist/logger是vuex在開發(fā)環(huán)境可以自動(dòng)打印日志的工具旧巾,debug比較方便,建議使用忍些。
然后在src/main.js引入:

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

Vue.config.productionTip = false
App.mpType = 'app'

Vue.prototype.$store = store

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

這樣就可以在項(xiàng)目中正常使用啦鲁猩,完全支持mapState,mapActions,mapGetters的寫法,比如在pages/index/index.vue中使用:

<script>
import { mapState, mapActions } from 'vuex'
export default {
  computed: {
    ...mapState(['myAudio'])
  },
  methods: {
    ...mapActions(['myActions'])
  },
  created () {
    this.myActions() //調(diào)用vuex中的方法
  }
}
</script>

踩坑指南

其實(shí)大多數(shù)坑可能是mpvue的罢坝,很多情況也是自己不熟悉小程序生命周期導(dǎo)致的一些奇奇怪怪的bug廓握。

mpvue是支持小程序原生組件的

mpvue會(huì)將div編譯為小程序中的view。一開始我不了解,以為用了mpvue后就不能使用小程序原生支持的組件了隙券,比如swiper,scroll-view等男应,小程序是支持的,可以放心使用哈哈娱仔。

npm run build后樣式丟失

本來在開發(fā)環(huán)境正常的沐飘,然后準(zhǔn)備發(fā)版npm run build后發(fā)現(xiàn)樣式丟失了。然后重新npm start排查問題牲迫,樣式還是丟失的耐朴。內(nèi)心此時(shí)是mmp的:npm run build丟失就算了,我沒改什么東西重新npm start后為什么還是丟失盹憎,之前還是正常的呀筛峭?

剛開始懷疑是緩存什么的問題,刪掉的dist目錄脚乡,重啟開發(fā)者工具蜒滩,甚至重啟電腦都試了一下,這是我遇到的超級(jí)詭異的問題之一奶稠。

冷靜下來想到:之前的版本是正常的俯艰,一定是新版本引入了什么導(dǎo)致了打包樣式的丟失。于是回滾版本一個(gè)個(gè)build排查問題锌订,最后找到了原因:在一個(gè)page中引入了其他page竹握,即在頁面中import另一個(gè)頁面。

在我這里的具體例子是:我在pages/index/index.vue 中想做底部共用一個(gè)tabbar辆飘,頁面根據(jù)tabbar的值來顯示對(duì)應(yīng)的子級(jí)頁面:pages/page1/index.vuepages/page2/index.vue啦辐。

所以我將這兩個(gè)頁面當(dāng)做子組件來引入了:import Page1 from '@/pages/page1',一開始沒有問題蜈项,等重啟項(xiàng)目芹关,或者build后就發(fā)現(xiàn)樣式丟失了。

這可能是mpvue打包機(jī)制的一個(gè)限制紧卒,即頁面不能將另一個(gè)頁面當(dāng)子組件來引用侥衬,否則會(huì)導(dǎo)致樣式丟失。

背景音頻的src無法讀取

項(xiàng)目中希望用戶退出小程序后依然能播放音頻跑芳,所以用到了背景音頻的api: wx.getBackgroundAudioManager()轴总。

this.audio = wx.getBackgroundAudioManager()
this.audio.src = 'http://ws.stream.qqmusic.qq.com/M500001VfvsJ21xFqb.mp3?guid=ffffffff82def4af4b12b3cd9337d5e7&uin=346897220&vkey=6292F51E1E384E061FF02C31F716658E5C81F5594D561F2E88B854E81CAAB7806D5E4F103E55D33C16F3FAC506D1AB172DE8600B37E43FAD&fromtag=46' 
this.audio.title = '此時(shí)此刻' //注意必填
this.audio.epname = '此時(shí)此刻'
this.audio.singer = '許巍'
this.audio.coverImgUrl = 'http://y.gtimg.cn/music/photo_new/T002R300x300M000003rsKF44GyaSk.jpg?max_age=2592000'

titlesrc賦值后會(huì)直接播放音頻,后面的幾個(gè)屬性建議也填上博个,因?yàn)椴シ疟尘耙纛l時(shí)微信是有個(gè)界面需要封面圖和歌手名稱等的怀樟。

如果想要獲取當(dāng)前正在播放的音頻src,本來以為通過this.audio.src來獲取就可以了但是有bug盆佣。

在開發(fā)者工具中是可以正常獲取的往堡,即開發(fā)時(shí)是沒問題的械荷,但在真機(jī)上返回的是undefined,因此不能用this.audio.src來獲取當(dāng)前播放的音頻url投蝉,得用一個(gè)變量來存這個(gè)數(shù)據(jù)养葵。

直接使用音頻的currentTime可能渲染不及時(shí)

currentTime用于顯示當(dāng)前的播放進(jìn)度,但我用在子組件中時(shí)經(jīng)常更新不及時(shí)瘩缆,打印是正常的,但試圖渲染不及時(shí)佃蚜,有時(shí)候需要點(diǎn)擊一下才能重新渲染庸娱,這可能是mpvue使用時(shí)才會(huì)遇到。

所以建議還是項(xiàng)目自身維護(hù)一套背景音頻的變量比較好一點(diǎn)谐算,比如放在vuex中熟尉。監(jiān)聽BackgroundAudioManager.onTimeUpdate()方法每次賦值到自身維護(hù)的變量中。

音頻的onCanplay方法不一定每個(gè)音頻都會(huì)觸發(fā)

一開始我監(jiān)聽在onCanplay方法洲脂,將音頻的時(shí)長(zhǎng)信息duration賦值到vuex中存起來斤儿,但發(fā)現(xiàn)onCanplay有時(shí)候是不會(huì)觸發(fā)的,比如重新賦值src播放下一首時(shí)恐锦,很尷尬往果。

所以不要太依賴onCanplay這個(gè)方法,還好目前直接使用audio.duration好像不會(huì)出現(xiàn)像上面的currentTime渲染不及時(shí)的問題一铅,所以就這樣用著先陕贮。

音頻播放結(jié)束,即onStop后潘飘,不能再通過audio.play()的方法重新播放肮之,得重新賦值src

正常來說,音頻播放結(jié)束后卜录,音頻的src是不變的戈擒,再次play()應(yīng)該是可以的。但在小程序中偏偏不行艰毒,得重新賦值src才能重新播放筐高,這應(yīng)該是小程序的一個(gè)bug。现喳。凯傲。

所以需要判斷一下暫停停止的情況,用不同的辦法播放嗦篱。正常來說冰单,音頻暫停時(shí)currentTime是不為0的,而結(jié)束時(shí)currentTime會(huì)為0灸促。

所以可以通過currentTime(最好是自己維護(hù)的變量)來判斷暫停和停止的情況:如果currentTime不為0诫欠,表示是暫停的情況涵卵,可以用play(),如果小于等于0,則重新賦值src播放

if (currentTime) {
  this.audio.play()
} else {
  this.audio.src = 'xx.mp3'
}

mpvue不支持直接在template上直接綁定函數(shù)

這個(gè)是mpvue文檔上有寫的荒叼,不過一開始并不是很理解轿偎,也踩坑了,所以在這里提一下被廓,避免不知道的同學(xué)踩坑找半天坏晦。

<template>
  <div v-for="(item, index) in list" :key="index">{{ formatItem(item) }}</div>
</template>

<script>
export default {
  data () {
    return{
      list: [1, 2, 3]
    }
  },
  methods: {
    formatItem (item) {
      return `我是${item}`
    }
  }
}
</script>

上面的代碼應(yīng)該是日常vue中比較常用的,就是將數(shù)據(jù)傳參給方法做一些處理嫁乘,這個(gè)在mpvue中是不支持的昆婿,會(huì)被編譯成一個(gè)空字符串。

小程序中可放心使用css3的一些特性

比如高斯模糊

filter: blur(50px);

如果要使用動(dòng)畫蜓斧,盡量用css動(dòng)畫代替wx.createAnimation

在實(shí)際使用時(shí)仓蛆,wx.createAnimation做動(dòng)畫其實(shí)很卡,性能很差挎春,所以在需要使用動(dòng)畫時(shí)看疙,建議盡量使用css做動(dòng)畫。

在小程序中是支持css動(dòng)畫的直奋,transition,animation,@keyframes這些特性都支持能庆。

比如做一個(gè)div一直旋轉(zhuǎn)的動(dòng)畫,大家可以對(duì)比一下兩個(gè)版本:

  • wx.createAnimation版本

原理:通過setInterval()不斷更新div的旋轉(zhuǎn)位置

<template>
  <div class="cover" :animation="animationData"></div>
</template>

<script>
export default {
  data () {
    return {
      animationData: '',
      animation: '',
      rotateCount: 0,
      timer: ''
    }
  },
  components: {

  },
  methods: {
     startRotate () {
       this.timer = setInterval(() => {
         this.rotateAni(++this.rotateCount)
       }, 100)
     },
     rotateAni (n) {
       if (!this.animation) {
         return
       }
       // 每100毫秒旋轉(zhuǎn)10度
       this.animation.rotate(10 * n).step()
       this.animationData = this.animation.export()
     }
  },
  onShow () {
     // 頁面從隱藏到顯示時(shí)才執(zhí)行
     if (!this.animation) {
       this.animation = wx.createAnimation()
       this.startRotate()
     }
  },
  onReady () {
     // 第一次初始化時(shí)會(huì)執(zhí)行
     if (!this.animation) {
       this.animation = wx.createAnimation()
       this.starRotate()
     }
  },
  onHide () {
    // 頁面隱藏時(shí)會(huì)執(zhí)行帮碰,避免頻繁的setData操作相味,將定時(shí)器停掉
    this.timer && clearInterval(this.timer)
  },
  beforeDestroy () {
    // 頁面卸載,也停掉定時(shí)器
    this.timer && clearInterval(this.timer)
  }
}
</script>

<style scoped lang="scss">
  .cover {
    left: 20px;
    bottom: 70px;
    border-radius: 50%;
    background: #fff;
    position: absolute;
    width: 50px;
    height: 50px;
    background: rgba(0, 0, 0, 0.2);
    box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.2);
    border: 1px solid rgba(255, 255, 255, 0.5);
    overflow: hidden;
    z-index: 10000;
  }
</style>

  • 使用css的@keyframes做旋轉(zhuǎn)動(dòng)畫
<template>
  <div class="cover" :style="coverStyle"></div>
</template>

<script>
export default {
}
</script>

<style scoped lang="scss">
  // 定義一個(gè)動(dòng)畫名為 rotate
  @keyframes rotate {
    0%,
    100% {
      transform: rotate(0deg);
    }
    100% {
      transform: rotate(360deg);
    }
  }
  .cover {
    left: 20px;
    bottom: 70px;
    border-radius: 50%;
    background: #fff;
    position: absolute;
    width: 50px;
    height: 50px;
    background: rgba(0, 0, 0, 0.2);
    box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.2);
    border: 1px solid rgba(255, 255, 255, 0.5);
    overflow: hidden;
    z-index: 10000;
    // 使用動(dòng)畫
    animation: rotate 4s linear infinite;
  }
</style>

用js寫的動(dòng)畫需要控制好setInterval的間隔時(shí)間和旋轉(zhuǎn)角度殉挽,比較難調(diào)丰涉。而用css寫動(dòng)畫很簡(jiǎn)單,性能比js好斯碌,代碼量也很少一死。

使用css動(dòng)畫時(shí)建議開啟硬件加速

為了動(dòng)畫更流暢,想盡辦法做優(yōu)化傻唾,雖然不知道有沒效果投慈,反正用了再說[手動(dòng)滑稽]。

可以用will-changetransform: translate3d(0,0,0)開啟硬件加速冠骄。我也不太會(huì)用伪煤,具體用法大家自行百度Google。

will-change: auto;
transform: translate3d(0, 0, 0);

iPhoneX需要底部導(dǎo)航條預(yù)留34px(68rpx)的高度凛辣。

由于小程序中不能設(shè)置viewport-fit=cover抱既,所以也就沒有web中的安全區(qū)域說法,目前主流的做法是通過wx.getSystemInfoSync()判斷是否是ipx扁誓,若是則給頁面底部撐高34px防泵。

const res = wx.getSystemInfoSync()
if (res.model.indexOf('iPhone X') >= 0) {
  this.isIpx = true
}

注意是用res.model.indexOf('iPhone X'),在開發(fā)者工具的iPhone X中蚀之,model是全等于iPhone X的,但在真機(jī)中往往拿到的值是iPhone X GZxxx捷泞,即后面可能會(huì)帶一串東西足删,所以用indexOf才是比較穩(wěn)的,而且對(duì)iPhone XR等機(jī)型也適用锁右。

由于還有其他安卓機(jī)的全面屏失受,不太可能一一判斷,而且某些安卓全面屏是沒有用iPhone底部的工具條的(不存在沖突的情況)咏瑟,所以我們只判斷iPhone X的情況就可以了贱纠,其他全面屏就不需要給底部預(yù)留了。

至于全面屏布局的適配响蕴,需要用flex布局或者獲取屏幕寬高來慢慢調(diào)了,建議最好用flex布局自適應(yīng)處理惠桃。

for循環(huán)中的子組件click事件無法觸發(fā)

Page -> 父組件 -> 子組件浦夷,在子組件click后$emit一個(gè)事件出來,發(fā)現(xiàn)無法觸發(fā)辜王。

這個(gè)bug一開始沒有出現(xiàn)劈狐,但偶然npm run build出現(xiàn)的,然后排查原因呐馆,后面即使回滾所有版本再npm start也還會(huì)出現(xiàn)肥缔。好像不觸發(fā)則已,一發(fā)就不可收拾汹来,這又是一個(gè)大坑续膳,搜issue和加群?jiǎn)柸耍?dāng)晚下班回家研究到1點(diǎn)多都沒有解決收班。

第二天繼續(xù)研究坟岔,感覺可能是框架的原因,最后嘗試升級(jí)一下mpvue版本摔桦,沒想到就正常了社付。直接使用quick-strat項(xiàng)目的mpvue版本是 2.0.0,mpvuempvue-template-compiler升級(jí)到最新2.0.6就解決了邻耕。

事后查看mpvue版本記錄鸥咖,果然是框架本身原因,并且找到了issue兄世。

npm run build后代碼報(bào)錯(cuò)啼辣,再build一次可能報(bào)另一些錯(cuò)

解決: 沒找到原因,可能是引入vant導(dǎo)致的碘饼,打包時(shí)丟失了部分文件熙兔。多build幾次悲伶,或者重啟下小程序開發(fā)者工具就正常了。

mpvue中created() 鉤子會(huì)在頁面初始化時(shí)全部一起觸發(fā)住涉,盡量不要用

小程序生命周期的理解

  1. 進(jìn)入已銷毀的page組件時(shí)依次觸發(fā): onLoad,onShow,onReady,beforeMount,mounted
  2. 第一次進(jìn)入已銷毀的子組件時(shí)依次觸發(fā): onLoad,onReady,beforeMount,mounted
  3. 第二次進(jìn)入已銷毀的子組件時(shí)依次觸發(fā): onLoad,onShow,onReady
  4. 再次進(jìn)入 未被銷毀的page組件麸锉、子組件時(shí)只觸發(fā): onShow

mpvue文檔中建議盡量不要使用小程序的生命周期,這個(gè)應(yīng)該是為了讓項(xiàng)目更好地適應(yīng)支付寶小程序和頭條小程序等舆声,所以才這樣建議大家盡量不要使用某一個(gè)小程序自身的api花沉。

如果你們的小程序只是微信小程序(不考慮兼容其他平臺(tái)小程序),我建議直接用小程序的生命周期媳握,而不要用mpvue的生命周期碱屁,坑太多了。比如mpvue的created周期蛾找,初始化時(shí)所有的page都會(huì)執(zhí)行娩脾,所以created這個(gè)周期是不能用了。

onUnload不觸發(fā)

小程序中與平常web開發(fā)不同的是打毛,它的頁面會(huì)被緩存柿赊。舉個(gè)例子:

  1. page1跳轉(zhuǎn)到page2,再從page2返回page1,此時(shí)的page1還沒銷毀幻枉,不會(huì)觸發(fā)onLoad再重新渲染碰声,而是直接使用之前的數(shù)據(jù)。從性能上來說熬甫,單純的返回不應(yīng)該再請(qǐng)求api獲取數(shù)據(jù)重新渲染胰挑,這是對(duì)的,符合我們的預(yù)期椿肩。
  2. 而有時(shí)候瞻颂,從page2返回page1時(shí),我們希望page1是重新獲取數(shù)據(jù)渲染的覆旱。比如在page2做了一個(gè)退出登錄的操作蘸朋,此時(shí)再返回page1時(shí),還是會(huì)看到之前的數(shù)據(jù)扣唱。實(shí)際上我們的預(yù)期是:由于已經(jīng)退出登錄了藕坯,page1的數(shù)據(jù)應(yīng)該被銷毀了。

在平常的web開發(fā)中噪沙,遇到上面的問題炼彪,我們可能是不管緩存,每次返回page1都再次請(qǐng)求api渲染最新的數(shù)據(jù)正歼,犧牲掉部分性能從而保證邏輯的正確性辐马。

在mpvue中我也嘗試這樣干了:想在page1onUnload()生命周期中銷毀數(shù)據(jù),但是沒有成功局义。即使在page2退出登錄時(shí)喜爷,采用wx.reLaunch()重新刷一遍冗疮,page1onUnload()生命周期也沒有執(zhí)行。所以onUnload()是有可能不執(zhí)行的檩帐,建議慎用术幔。

最后還是得想辦法做到page2控制page1的數(shù)據(jù)銷毀或保留。想到這里湃密,vuex就不自覺浮現(xiàn)在眼前了诅挑,如果page1的數(shù)據(jù)是通過vuex來控制的,那么我在page2就可以用vuex來靈活管理其他頁面的數(shù)據(jù)了泛源。

如果page2做退出登錄操作時(shí)拔妥,就讓page1的數(shù)據(jù)銷毀,如果是不退出登錄正常返回达箍,page1的數(shù)據(jù)還是正常没龙,做到靈活控制。

個(gè)人平時(shí)web開發(fā)很少用vuex缎玫,因?yàn)轫?xiàng)目比較簡(jiǎn)單不用那么復(fù)雜的全局?jǐn)?shù)據(jù)傳遞兜畸。但在小程序中,建議全局使用vuex來控制所有數(shù)據(jù)(當(dāng)然是得根據(jù)需求來用)碘梢。

總結(jié)

第一次開發(fā)小程序就直接上了mpvue,可能有些坑已經(jīng)很多同學(xué)總結(jié)過了伐蒂,有些坑可能是不熟悉而導(dǎo)致的煞躬,但自己沒有去踩過一遍可能不夠深刻。

有兩種坑會(huì)比較難啃:

  1. 框架本身的問題逸邦,如mpvue2.0.0出現(xiàn)的子組件無法觸發(fā)事件的問題恩沛。
  2. 開發(fā)者工具和真機(jī)運(yùn)行環(huán)境不一致導(dǎo)致的坑。

遇到真機(jī)和開發(fā)者工具不一致的情況缕减,可按以下步驟排查:

  1. 有可能是緩存雷客,可以殺掉之前的版本再跑起來
  2. 手機(jī)微信版本太低,可能api不支持桥狡,用wx.canIUse打印一下
  3. 手機(jī)端某些屬性不支持讀取搅裙,比如上面的this.audio.src,可以在真機(jī)打印調(diào)試一下
  4. 代碼在手機(jī)端運(yùn)行有報(bào)錯(cuò)裹芝,可以在手機(jī)端開啟調(diào)試部逮,看一下log
  5. 微信設(shè)計(jì)上的坑,百度下是否有相關(guān)的案例和解決辦法

而遇到mpvue框架的問題可以:

  1. 去搜一下mpvue的issue看有沒相關(guān)解決辦法
  2. 盡量使用最新版本的框架嫂易,可能某些問題已經(jīng)修復(fù)了的兄朋。實(shí)在解決不了的,建議想辦法繞過怜械,換一種方法來實(shí)現(xiàn)颅和。

希望對(duì)大家有所幫助傅事。

作者:fengxianqi
鏈接:http://www.reibang.com/p/de667b477057
來源:簡(jiǎn)書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)峡扩,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處蹭越。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市有额,隨后出現(xiàn)的幾起案子般又,更是在濱河造成了極大的恐慌,老刑警劉巖巍佑,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茴迁,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡萤衰,警方通過查閱死者的電腦和手機(jī)堕义,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脆栋,“玉大人倦卖,你說我怎么就攤上這事〈徽” “怎么了怕膛?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)秦踪。 經(jīng)常有香客問我褐捻,道長(zhǎng),這世上最難降的妖魔是什么椅邓? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任柠逞,我火速辦了婚禮,結(jié)果婚禮上景馁,老公的妹妹穿的比我還像新娘板壮。我一直安慰自己,他們只是感情好合住,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布绰精。 她就那樣靜靜地躺著,像睡著了一般透葛。 火紅的嫁衣襯著肌膚如雪茬底。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天获洲,我揣著相機(jī)與錄音阱表,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛最爬,可吹牛的內(nèi)容都是我干的涉馁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼爱致,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼烤送!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起糠悯,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤帮坚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后互艾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體试和,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年纫普,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了阅悍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡昨稼,死狀恐怖节视,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情假栓,我是刑警寧澤寻行,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站匾荆,受9級(jí)特大地震影響寡痰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜棋凳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望连躏。 院中可真熱鬧剩岳,春花似錦、人聲如沸入热。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勺良。三九已至绰播,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尚困,已是汗流浹背蠢箩。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谬泌。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓滔韵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親掌实。 傳聞我的和親對(duì)象是個(gè)殘疾皇子陪蜻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容