微信,對(duì)于大家來(lái)說(shuō),已經(jīng)是很普及的一個(gè)應(yīng)用,幾乎大街小巷的人,手里都會(huì)安裝一個(gè)叫微信的app,他能記錄我們的日常,支付我們的消費(fèi)......,幾乎無(wú)所不能。
而一談到微信,我們就不得不說(shuō)微信上的小程序,微信小程序是一種不用下載,就可以使用的應(yīng)用,自從2017年1月9日,張小龍?jiān)?017微信公開(kāi)課上發(fā)布正式上線以來(lái),就得到廣泛應(yīng)用,小程序的應(yīng)用數(shù)量超過(guò)了一百萬(wàn),覆蓋200多個(gè)細(xì)分領(lǐng)域,日活躍量達(dá)到兩個(gè)億以上。
微信小程序這么強(qiáng)大功能的背后,到底都有些什么呢?現(xiàn)在我們來(lái)聊聊微信小程序的那些事兒。
微信小程序把啟動(dòng)分為兩種:冷啟動(dòng)、熱啟動(dòng)
冷啟動(dòng)就是第一次啟動(dòng)小程序,或是小程序從被內(nèi)存銷毀到再次啟動(dòng)
熱啟動(dòng)就是用戶打開(kāi)過(guò)小程序還沒(méi)有被銷毀,再打開(kāi)小程序就只是把小程序直接從后臺(tái)切到前端顯示。而對(duì)于小程序銷毀的時(shí)機(jī)是什么時(shí)候呢?我們研究過(guò):小程序切到后臺(tái)后,五分鐘內(nèi)就會(huì)被微信主動(dòng)銷毀,而在iOS下如果五秒內(nèi)超過(guò)1次的內(nèi)存告警,就會(huì)被銷毀。
對(duì)于用戶來(lái)說(shuō),如果手動(dòng)在小程序列表中刪除小程序,需要調(diào)用App.js里面的函數(shù),包括的函數(shù)有:
onLaunch() ,小程序初始化應(yīng)用對(duì)象時(shí)調(diào)用一次,即每次冷啟動(dòng)的時(shí)候會(huì)調(diào)用一次,熱啟動(dòng)不會(huì)被調(diào)用
onShow(),小程序從后臺(tái)進(jìn)入前臺(tái)時(shí)調(diào)用
onHide() ,小程序從前臺(tái)進(jìn)入后臺(tái)時(shí)調(diào)用
onError() ,小程序發(fā)生腳本錯(cuò)誤,或是調(diào)用微信api失敗時(shí)觸發(fā)。
onPageNotFound() ,當(dāng)訪問(wèn)小程序不存的頁(yè)面時(shí),該頁(yè)面會(huì)被觸發(fā),一般在里面寫一些404跳轉(zhuǎn)頁(yè)面
每個(gè)頁(yè)面對(duì)象里的生命周期回調(diào)函數(shù)及默認(rèn)事件處理函數(shù)有:
onPullDownRefresh() ,即當(dāng)用戶下拉時(shí)觸發(fā),要在app.json的window選項(xiàng)中或頁(yè)面配置中開(kāi)啟enablePullDownRefresh才有效哈
onReachBottom() ,監(jiān)聽(tīng)用戶上拉觸底事件,可以在app.json的window選項(xiàng)中或頁(yè)面配置中設(shè)置觸發(fā)距離onReachBottomDistance
onPageScroll() ,監(jiān)聽(tīng)滑動(dòng)頁(yè)面事件,切記切記別在此方法里過(guò)于頻繁執(zhí)行setData
onShareAppMessage() ,監(jiān)聽(tīng)用戶點(diǎn)擊分享時(shí),自定義分享的標(biāo)題內(nèi)容
onResize() ,小程序屏幕旋轉(zhuǎn)時(shí)觸發(fā)?;A(chǔ)庫(kù) 2.4.0 開(kāi)始支持哈
onTabItemTap() ,點(diǎn)擊 tab(即底部菜單欄) 時(shí)觸發(fā),基礎(chǔ)庫(kù) 1.9.0 開(kāi)始支持
onLoad() ,面加載時(shí)觸發(fā), 只在頁(yè)面第一次加載時(shí)觸發(fā)
onShow() ,頁(yè)面從后臺(tái)切入前臺(tái)時(shí)觸發(fā),頁(yè)面初始化時(shí)觸發(fā)
onReady(),頁(yè)面初次渲染完成時(shí)觸發(fā),只觸發(fā)一次
onHide(),頁(yè)面從前臺(tái)切入后臺(tái)時(shí)觸發(fā)
onUnload(),頁(yè)面卸載時(shí)觸發(fā),即redirectTo或navigateBack到其他頁(yè)面時(shí)觸發(fā)
以上是APP.js中關(guān)于小程序的接口函數(shù),如果微信小程序要跳轉(zhuǎn)H5,必須現(xiàn)在微信小程序中嵌入一個(gè)web-view的組件。而且必須是已經(jīng)打開(kāi)了的WebView,不可以跳轉(zhuǎn)到外部的H5頁(yè)。目前 H5 頁(yè)不可跳小程序,只有在小程序以 web-view 組件打開(kāi)的 H5 里才可以跳回到小程序,并后H5的地址,還必須在小程序的管理后臺(tái),手動(dòng)添加到白名單。而且這個(gè)白名單地址可以是任意可訪問(wèn)的地址。
App 可以跳轉(zhuǎn)到小程序,小程序只能被動(dòng)跳轉(zhuǎn)到 App,不可主動(dòng)跳轉(zhuǎn)到 App。被動(dòng)是指只有當(dāng) App 主動(dòng)跳入小程序,小程序才可以跳回到 App。
微信小程序的渲染方式為 WebView,而非原生渲染,只有 <canvas/>、<video/>、<map/>、<textarea/>、<input>、<live-pusher>、<live-player> 幾個(gè)組件才是原生渲染。
微信小程序目前統(tǒng)一使用 rpx 單位來(lái)隔離機(jī)器之間屏幕大小的差異,以達(dá)到適配,讓開(kāi)發(fā)者更加專注業(yè)務(wù)。
目前一個(gè)小程序不可超過(guò) 2M,如果小程序做了分包,則所有包加起來(lái)不可超過(guò) 8M,每個(gè)包不可超過(guò) 2M。
微信開(kāi)發(fā)者工具下 JS 是跑在 Node-Webkit 內(nèi)核,iOS 下是跑在 JSCore 內(nèi)核,安卓下是跑在 X5 內(nèi)核。
iOS 下大圖和長(zhǎng)列表圖都會(huì)導(dǎo)致 WKWebView 被回收。
同一個(gè)微信用戶,同一個(gè)小程序 storage 上限為 10MB,如果存儲(chǔ)空間不足,會(huì)自動(dòng)清除掉最久沒(méi)使用的數(shù)據(jù);本地緩存文件和用戶文件普通小程序上限 10M,游戲小程序上限 50M。
wx.request、wx.uploadFile、wx.downloadFile 默認(rèn)超時(shí)時(shí)間和最大超時(shí)時(shí)間都是 60s,最大并發(fā)限制是 10 個(gè),網(wǎng)絡(luò)請(qǐng)求的 Referer header 不可設(shè)置。其格式固定為 https://servicewechat.com/{appid}/{version}/page-frame.html,其中 {appid} 為微信小程序的 AppID,{version} 為小程序的版本號(hào)。版本號(hào)為 0 表示為開(kāi)發(fā)版、體驗(yàn)版及審核版本,版本號(hào)為 devtools 表示為開(kāi)發(fā)者工具,其余為正式版本。
在寫頁(yè)面的時(shí)候,如果頁(yè)面上有倒計(jì)時(shí)功能,在微信小程序 onHide 后沒(méi)有停掉倒計(jì)時(shí),在 iPhone 下就會(huì)觸發(fā)內(nèi)存不夠,微信小程序被回收;而再把微信小程序切回到前臺(tái)界面上,微信小程序又沒(méi)有重新渲染,從而導(dǎo)致白屏。建議在 onHide 里及時(shí)結(jié)束倒計(jì)時(shí),onShow 里再重新啟動(dòng)。
成都微信小程序開(kāi)發(fā)團(tuán)隊(duì)認(rèn)為,在當(dāng)今,微信小程序開(kāi)發(fā)的技能,是需要我們開(kāi)發(fā)人員掌握的基本技能,掌握了該基本技能,才能適應(yīng)市場(chǎng)的需求。而微信小程序的開(kāi)發(fā),對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),這項(xiàng)技能掌握起來(lái)也是十分快速的。