亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 課堂 > 小程序 > 正文

分享幾個微信小程序開發常用優化技巧

2020-03-21 16:29:50
字體:
來源:轉載
供稿:網友

小程序科普類的文章已經很多了,這里講下針對小程序的優化方法,可以有效提高小程序的響應速度和用戶體驗。當然,開發體驗也提高不少。

1、提高頁面加載速度——前端永恒不變的話題

在小程序這個環境下,怎樣提高頁面加載速度呢? 這個問題很大,我把問題具體一下,如何縮短從用戶點擊某個鏈接,到打開新頁面的這段時間?這里拋一個核心關鍵點:

從頁面響應用戶點擊行為,開始跳轉,到新頁面onload事件觸發,存在一個延遲,這個延遲大概在100-300ms之間(安卓響應比ios慢些)。

這個延遲說短不短,我們可以利用這段時間,預先發起新頁面所需要的網絡請求。這樣一來,就節省了100-300ms(或者一個網絡請求的時間)。

知道有這個gap后,代碼如何實現呢?

說白了,就是實現一個在A頁面預加載B頁面數據的功能。但而這種跨頁面的調用,很容易把邏輯搞復雜,將不同頁面的邏輯耦合在一起。所以,我們希望將預加載的邏輯隱藏于無形中,不增加任何的頁面間耦合,以及開發復雜度。

下面以騰訊視頻小程序為例,講解下技術實現。

小程序首頁:

微信小程序,小程序開發

當用戶點擊海報圖后,會執行以下代碼(就一行):

 

onPlay: function (e) {        this.$route('/pages/play/index?cid='+this._cid);}

 

接下來程序會加載播放頁:

微信小程序,小程序開發

播放頁主要代碼:

 

    fetchData: function (query) {    },    onNavigate: function (res) {        this.$put('play-detail', this.fetchData(res.query));    },    onLoad: function (query) {        this.$take('play-detail') || this.fetchData(query);    }

 

可以看到,不管是外部頁面的調用還是實際邏輯的實現都非常簡潔。在第二個頁面中,我們擴展了Page的生命周期函數,增加了onNavigate方法。該方法在頁面即將被創建但還沒開始創建的時候執行。

老司機也許會發現這里有點蹊蹺。在首頁點擊的時候,播放頁根本就沒有創建,對象都不存在,怎么訪問到里面的方法呢?

這里就要說下微信的頁面機制。

在小程序啟動時,會把所有調用Page()方法的object存在一個隊列里(如下圖)。每次頁面訪問的時候,微信會重新創建一個新的對象實例(實際上就是深拷貝)。也就是說,在A頁面在執行點擊響應事件的時候,B頁面的實例還沒創建,這時候調用的onNavigate方法,實際上是Page對象的原型(小程序啟動時候創建的那個)。而接下來馬上要被創建的B頁面,又是另外一個object。所以,在onNavigate和onLoad方法中,this指針指的不是同一個對象,不能把臨時數據存儲在當前object身上。因此我們封裝了一對全局的緩存方法,$put()和$take()。

微信小程序,小程序開發

為了通用性,Page上用到的公共的方法,比如$route、$put、$take都定義在了一個Page的基類里面?;愡€同時保存了所有頁面的list,這樣就可以做到根據頁面名調用具體頁面的onNavigate方法。 當然,并不是每個頁面都需要實現onNavigate方法,對于沒有定義onNavigate方法的,$route函數會跳過預加載環節,直接跳轉頁面。所以對于開發者來說,不需要關心別的頁面實現了什么,對外看來完全透明。

2、用戶行為預測

在上面的例子中,我們實現了用戶主動點擊頁面,提前加載下一頁面數據的方法。而在某些場景下,用戶的行為可以預測,我們可以在用戶還沒點擊的時候就預加載下個頁面的數據。讓下個頁面秒開,進一步提升體驗的流暢性。

繼續以騰訊視頻小程序為例,主界面分為3個頁卡(大部分小程序都會這么設計),通過簡單的數據分析,發現進入首頁的用戶有50%會訪問第二個頁卡。所以預加載第二個頁卡的數據可以很大程度提高用戶下個點擊頁面的打開速度。

同樣,先看看代碼實現。 首頁預加載頻道頁的姿勢:

 

onReady: function(){        //預加載頻道頁        this.$preLoad("/pages/channel/index")    }

 

頻道頁的實現方法:

 

onPreload: function(req){        //拉取數據        this.fetchData({            id: req.query.channelId ? req.query.channelId : defaultId,            isPreload: true        })    }

 

跟第一個例子類似,這里定義了一個$preLoad()方法,同時給Page擴展了一個onPreload事件。頁面調用$preLoad()后,基類會自動找到該頁面對應的onPreload函數,通知頁面執行預加載操作。 跟第一個例子不同,這里預加載的數據會保存在storage內,因為用戶不一定會馬上訪問頁面,而把數據存在全局變量會增加小程序占用的內存。微信會毫不猶豫的把內存占用過大的小程序給殺掉。

也許對于大部分有app開發經驗的同學來說,更普遍的做法是先讓頁面展示上次緩存的數據,再實時拉取新數據,然后刷新頁面。這個方法在小程序上也許體驗并不太好,原因是小程序的性能以及頁面渲染速度都不如原生app。將一個大的data傳輸給UI層,是一個很重的操作。因此不建議采用這種方法。

3、減少默認data的大小

剛剛說到,頁面打開一個新頁面時微信會深拷貝一個page對象,因此,應該盡量減少默認data的大小,以及減少對象內的自定義屬性。有圖有真相:

微信小程序,小程序開發

以一個100個屬性的data對象為測試用例,在iphone6上,頁面的創建時間會因此增加150ms。

4、組件化方案

微信沒有提供小程序的組件化方案(相信一定在實現中)。但開談不說組件化,寫再多代碼也枉然。這里演示一個簡單的組件化實現。

以騰訊視頻播放頁為例,頁面定義如下:

 

P('play', {    comps: [        require('../../comps/player/index'),        require("../../comps/toast/index")(),        require("../../comps/topbar/topbar")(),        require('../../comps/comment/index')(),        require('../../comps/recommend/index')(),        require('../../comps/playdesc/index')()    ],    onLoad: function (query) {    }    ...}

 

其中,P()函數是自定義的基類。這是一個非常有用的東西,可以把所有通用的邏輯都寫在基類里面,包括pv統計,來源統計,擴展生命周期函數,實現組件化等。

函數第一個參數是頁面名稱,作為頁面的key。第二個是page對象,其中擴展了一個comps數組,里面就是所有要加載的組件。

以播放器組件/comps/player/index.js為例:

 

module.exports = {    data: {        tvp: {            url: '',            state: "stop"        }    },    onLoad: function (query) {    },    tvpStartPlay: function () {    }}

 

組件的定義跟一個普通Page對象一模一樣,有data屬性,onLoad、onShow等事件,也有頁面響應的回調方法。wxml模板里定義的事件和js事件一一對應。

基類做的事情,就是把這些組件對象的屬性和方法復制到Page對象上(淺拷貝)。其中data屬性會merge到一起。而微信預定義的生命周期函數(包括自己擴展的),則封裝成隊列按序執行。比如當系統調用onLoad方法時,實際上是執行了所有組件的onLoad方法,最后再執行Page的onLoad。

以上是代碼部分,至于wxml模板和wxss部分,就要手工import過去了。

wxml:

<import src="/comps/comment/index.wxml" /><import src="/comps/recommend/index.wxml" /><import src="/comps/player/index.wxml"/><import src="/comps/toast/index.wxml"/><import src="/comps/playdesc/index.wxml"/><import src="/comps/topbar/index.wxml" />

 

 

wxss:

 

@import "/style/tabbar.wxss";@import "/comps/player/index.wxss";@import "/comps/toast/index.wxss";@import "/comps/comment/index.wxss";@import "/style/empty.wxss";@import "/comps/playdesc/index.wxss";

 

5、其他

雖然小程序已經足夠小巧,但啟動速度還是有那么2-3秒,無法做到秒開。樓主嘗試對小程序的啟動時間做優化,但沒有找到多少有價值的優化點。單個頁面的初始化只需要1-2ms。也許大部分時間消耗在了微信跟服務器端通信的過程中。期待微信不斷迭代優化。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲精品91在线| 日韩在线观看免费av| 国产精品网站大全| 久久91精品国产91久久跳| 久久精品91久久香蕉加勒比| 亚洲综合自拍一区| 欧美日韩激情视频| 91社影院在线观看| 国产精品一区二区三区久久久| 国产精品老牛影院在线观看| 亚洲成人免费在线视频| 2019中文字幕全在线观看| 亚洲午夜未满十八勿入免费观看全集| 久久视频在线视频| 55夜色66夜色国产精品视频| 日韩精品中文字幕视频在线| 亚洲美女中文字幕| 精品国产一区二区三区久久久狼| 91精品国产色综合久久不卡98口| 在线午夜精品自拍| 97av在线视频| 亚洲国产日韩欧美在线动漫| 久操成人在线视频| 欧美性猛交xxxx乱大交极品| 蜜臀久久99精品久久久久久宅男| 国产精品白嫩初高中害羞小美女| 国产成人av网址| 精品国产依人香蕉在线精品| 亚洲国产女人aaa毛片在线| 欧美极品少妇xxxxⅹ裸体艺术| 亚洲一二在线观看| 日日狠狠久久偷偷四色综合免费| 久久精品国产久精国产思思| 久久亚洲精品一区二区| 久久中文字幕视频| 992tv成人免费影院| 色午夜这里只有精品| 国产精品一区二区3区| 色偷偷88888欧美精品久久久| 欧美极品在线视频| 伊人久久男人天堂| 91精品在线国产| 色婷婷av一区二区三区久久| 国产精品免费在线免费| 国产成人亚洲精品| 2019中文字幕在线免费观看| 亚洲一区二区久久| 日韩成人网免费视频| 久久亚洲国产精品| 成人av在线天堂| 亚洲国产精品久久精品怡红院| 欧美日韩黄色大片| 久久中文字幕在线视频| 另类视频在线观看| 国产精品午夜国产小视频| 国产一区二区成人| 日韩在线视频免费观看高清中文| 国产色婷婷国产综合在线理论片a| 欧美国产日韩一区二区在线观看| 91成人免费观看网站| 欧美激情一区二区三区在线视频观看| 欧美激情第99页| 国产裸体写真av一区二区| 久久综合国产精品台湾中文娱乐网| 亚洲japanese制服美女| 亚洲天堂第二页| 欧美一级大胆视频| 国产精品中文字幕在线观看| 成人xvideos免费视频| 97色在线视频观看| 亚洲精品成人免费| 亚洲精品电影在线| 欧美日韩xxxxx| 国产精品亚洲视频在线观看| 狠狠色香婷婷久久亚洲精品| 亚洲xxxx做受欧美| 最新日韩中文字幕| 日韩中文字幕视频| 欧美精品久久久久久久久久| 97视频在线播放| 黑人巨大精品欧美一区二区三区| 国产精品亚洲片夜色在线| 欧美精品在线网站| 亚洲一区二区三区四区在线播放| 国产丝袜一区二区三区免费视频| 亚洲国产精品成人va在线观看| 欧美电影免费观看电视剧大全| 国产成人+综合亚洲+天堂| 成人黄色免费网站在线观看| 亚洲乱码一区二区| 亚洲女人天堂视频| 97精品伊人久久久大香线蕉| 国产在线观看91精品一区| 精品成人av一区| 久久黄色av网站| 性欧美暴力猛交69hd| 亚洲国产91精品在线观看| 国产欧美一区二区三区视频| 成人免费视频网| 伊人久久男人天堂| 精品国产欧美一区二区五十路| 亚洲精品动漫100p| 欧美激情亚洲一区| 久久久成人精品视频| 性欧美在线看片a免费观看| 国内揄拍国内精品少妇国语| 国产91ⅴ在线精品免费观看| 亚洲日本欧美日韩高观看| 亚洲精品国产精品国自产观看浪潮| 国产精品久久久久久久av电影| 国产精品亚洲一区二区三区| 国产一区二区三区免费视频| 日本韩国在线不卡| 中文字幕视频在线免费欧美日韩综合在线看| 正在播放欧美视频| 欧美日韩一区二区三区| 国产手机视频精品| 国产丝袜精品第一页| 精品久久久久久久久中文字幕| 国产成人精彩在线视频九色| 97婷婷涩涩精品一区| 91精品国产综合久久香蕉最新版| 亚洲国内高清视频| 亚洲色图日韩av| 欧美日韩中文字幕| 日韩av在线电影网| 久久精品小视频| 久久影视电视剧凤归四时歌| 日韩精品极品视频| 国产在线精品一区免费香蕉| 中文字幕日韩有码| 97国产成人精品视频| 欧美日韩在线视频观看| 国产91精品黑色丝袜高跟鞋| 国产精品一区av| 欧美日韩一区二区免费视频| 亚洲www永久成人夜色| 久久九九精品99国产精品| 亚洲成年人在线播放| 国产精品无码专区在线观看| 欧美色欧美亚洲高清在线视频| 136fldh精品导航福利| 欧美日韩一区二区免费在线观看| 国产精品久久久久免费a∨大胸| 中文字幕久久亚洲| 国产一区二区在线免费| 国产高清在线不卡| 亚洲激情免费观看| 日韩一区在线视频| 欧美精品激情blacked18| 成人久久18免费网站图片| 国产69精品久久久久9| 性色av香蕉一区二区| 97精品国产aⅴ7777| 国产精品久久色| 亚洲欧洲一区二区三区久久| 日韩在线观看成人| 国产91|九色| 国产成人97精品免费看片| 亚洲无av在线中文字幕| 久久综合电影一区| 久久艳片www.17c.com| 国产一级揄自揄精品视频| 91精品视频一区|