小程序開發(fā)實踐總結(jié)

小程序開發(fā)實踐總結(jié)

從微信發(fā)布小程序以來,各大公司紛紛跟進都想從微信這個流量池里撈一杯羹。我司也不例外,我們整個前端團隊這半年來基本上都是在開發(fā)小程序。前前后后也開發(fā)了四五個小程序了。總覺得要留下點什么,既是記錄那些年我們踩過的坑,也是希望大家別再掉坑。

那些年我們踩過的坑

{{}}不能執(zhí)行函數(shù)方法,{{}}只支持基本的簡單運算和ES6拓展運算符。如價格格式化這種常用的處理,只能在js代碼中處理好然后再模板中渲染。

this.setData({price:this.formatPrice(this.data.price)})復(fù)制代碼

可以通過wxs模塊解決{{}}中不能執(zhí)行函數(shù)的問題。可以做到模擬vue.js中過濾器的功能。

價格:{{tools.formatPrice(price)}}復(fù)制代碼

// wxs模塊varformatPrice =function(price){? ? price = price >>0;returnNumber(price /100).toFixed(2);}module.exports = {? ? formatPrice}復(fù)制代碼

小程序不支持分享鏈接到朋友圈,暫時的通用做法是生成保存有頁面小程序嗎的圖片到本地相冊。又用戶自行發(fā)朋友圈轉(zhuǎn)發(fā)。前端可以利用canvas來實現(xiàn),減輕服務(wù)端壓力。但是會有圖片鋸齒不清晰的問題。建議預(yù)覽圖和保存到真機的圖片采用不同的尺寸。保存在真機的圖片按照750的寬度實現(xiàn)。相比于預(yù)覽圖要大一些,這樣保存到手機的圖片會清晰很多。

小程序布局采用rpx單位,UI稿按照750的寬度出圖。可直接使用UI稿的尺寸。但是在某些機型上1rpx會無法顯示。可以用H5的方式實現(xiàn)1px效果。

iphoneX吸底按鈕的適配,可以用媒體查詢,也可以通過wx.getSystemInfo獲取機型來判斷。參考

@mediaonly screen? ? and (device-width :375px)? ? and (device-height :812px)? ? and (-webkit-device-pixel-ratio :3) { }復(fù)制代碼

頁面A -> 頁面B,頁面B的操作觸發(fā)了頁面A的數(shù)據(jù)更新。返回更新頁面A的數(shù)據(jù),通常有兩種方式來實現(xiàn)(我司采用了方案二):

在頁面A監(jiān)聽onShow事件,在onShow事件觸發(fā)時無腦更新頁面數(shù)據(jù)。

通過EventBus來實現(xiàn)跨頁面通信。

復(fù)雜組件的開發(fā),省市區(qū)三級聯(lián)動選擇器的開發(fā),獲取微信地址庫的地址的編碼和業(yè)務(wù)采用的省市區(qū)編碼對不上。

頁面路徑的層級,最大不能超過10層。

小程序小程序分包加載,微信對小程序包的大小有如下限制。

整個小程序所有分包大小不超過 8M

單個分包/主包大小不能超過 2M

微信小程序主流框架對比

wepy

mpvue

Taro

wepy

wepy應(yīng)該算是最早發(fā)布的小程序開發(fā)框架,提供了類vue.js的語法風(fēng)格和特性,現(xiàn)階段應(yīng)該也是應(yīng)用最廣泛的框架吧。我開發(fā)的幾個小程序也都是采用了wepy這個框架。我先來說說當(dāng)初為什么選擇這個框架的原因吧。

類Vue.js的語法風(fēng)格,適合我們團隊原有的的技術(shù)棧

支持組件化(當(dāng)時微信官方的API還不支持組件化)

支持加載外部npm包

支持ES6的寫法

前期使用wepy的過程中,wepy自帶bug。不過好在開發(fā)者響應(yīng)及時,基本上都能覆蓋大部分場景。

但是有個最大的坑點就是,wepy組件的實現(xiàn)方式。組件使用的是靜態(tài)編譯組件,即組件是在編譯階段編譯進頁面的,每個組件都是唯一的一個實例。?多個組件共享同一個數(shù)據(jù)。并且靜態(tài)編譯組件。導(dǎo)致組件A,在頁面A和頁面B被引用,會copy兩份代碼到頁面A和頁面B內(nèi)部。導(dǎo)致拆分組件并沒有對包的體積有任何減少。后期微信官方API支持組件化編程后,我們逐步把一些比較核心,體積較大的組件用原聲API重構(gòu)了。

mpvue

由美團團隊開發(fā),mpvue和wepy一樣也是在小程序上提供了類vue.js的開發(fā)體驗。作為后來者,搶占了很多wepy的市場份額(ps:我們團隊近期也在考慮從wepy遷移到mpvue)。這個框架的原理相比wepy要更加復(fù)雜一點,mpvue 修改了 Vue.js 的 runtime 和 compiler 實現(xiàn),提供了更加接近于vue.js的開發(fā)體驗。

Taro

Taro是由京東團隊開源的一套遵循 React 語法規(guī)范的多端開發(fā)解決方案。本身我對React和Taro都不是很了解,就不多解釋了。具體可以看開發(fā)團隊的博客和代碼了解更多細節(jié)多端統(tǒng)一開發(fā)框架 - Taro


我看小程序

我想從技術(shù)的角度來談?wù)勎覍ξ⑿判〕绦虻睦斫猓矣X得小程序本身是一個非常優(yōu)秀的Hybrid App的技術(shù)方案。有很多值得學(xué)的地方,可以應(yīng)用到我們Hybrid App的技術(shù)方案設(shè)計中來。了解和學(xué)習(xí)小程序技術(shù)原理也能更好的優(yōu)化我們的代碼。

渲染層和邏輯層分離


相比于之前常見的Hybrid的方案,小程序使用了雙線程模型:小程序的渲染層和邏輯層是是分開的,邏輯層通過JSCore來解析和執(zhí)行,渲染層是通過webview來渲染。之前的常見Hybrid離線包的方案大多使用webview同時實現(xiàn)頁面的渲染和js的解析。這樣做的的結(jié)果就是隔離了js的runtime,在js代碼中無法操作webview中的DOM對象和BOM對象。Js無法做任何和頁面渲染有關(guān)的操作。只能通過setData把數(shù)據(jù)從JsCore傳遞到webview。

獨立的JS運行環(huán)境,相比于webview同時處理頁面的渲染和JS的執(zhí)行帶來了一些好處:

js無法動態(tài)的在頁面插入節(jié)點和干預(yù)頁面的渲染,解決了安全和管控的問題,否則小程序的上線審核就變得毫無意義。

渲染層和邏輯層的分離,減輕了webview的壓力,js的執(zhí)行和頁面的渲染可以并行,不會出現(xiàn)js執(zhí)行卡主頁面渲染的情況。

多個頁面可以共享一個JS運行環(huán)境,數(shù)據(jù)很方便的共享,整個小程序的生命周期共享同一個上下文,接近App的體驗。

壞處在于:

多了很多webview和JSCore數(shù)據(jù)傳輸?shù)南模瑪?shù)據(jù)需要序列化成字符串格式進行傳輸。

離線包加載

離線包加載,常見的Hybrid App通過webview加載H5頁面,前端頁面都是放在服務(wù)器端。雖說保證了靈活性。但是加載性能收網(wǎng)速影響大。頁面切換白屏?xí)r間長。小程序離線包的加載方式。一次性加載所有的前端資源到本地再解壓。大大提升了用戶體驗。不過微信官方為了防止下載離線包的時間過程,也嚴格限制了小程序包的體積。(分包加載情況下子包大小不能超過2M,也就是初次打開加載的資源不能超過2M)

多webview架構(gòu)

多webview的頁面架構(gòu),小程序每新開一個頁面,都會用一個新的webview來渲染。為了防止webview對內(nèi)存的消耗。小程序限制層級不能超過10層。

預(yù)加載webview

預(yù)加載webview,微信會預(yù)加載多一個wkwebview(ios平臺)放后臺,用戶打開小程序時省去初始化wkwebview時間。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,087評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,521評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,493評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,207評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,603評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,813評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,364評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,110評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,305評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,532評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,953評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,209評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,033評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,268評論 2 375

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