歡迎大家前往騰訊雲+社區,獲取更多騰訊海量技術實踐干貨哦~
朱展,騰訊雲高級工程師,多年前后端開發經驗。目前負責騰訊雲小程序解決方案的演進,規划和開發。
大家下午好,我今天給大家帶來的分享主題是騰訊雲小程序解決方案。首先做一個自我介紹,我叫朱展,來自騰訊雲,目前負責騰訊雲小程序解決方案,從事設計開發的工作。
開始之前做一個現場的調查,多少人有開發小程序的經驗,請舉手!謝謝!比我想象的多一點,多少人用過小程序的?相信大家都用過。
為什么這么說大家都用過微信小程序呢?2017年3月份到2017年的11月份的增長趨勢比較平穩,有幾千萬億的量,2017年12月份出現了暴漲,那個點就是小游戲的發布,也就是跳一跳成為國民游戲的時間,大家都想辦法刷榜。在這個熱點過后,它的日活沒有出現斷崖式的下降,還是維持到很高的水准,現在的日活大概就是這個樣子。這是我們今天沙龍的背景。

小程序的架構
講我們微信小程序解決方案之前,還是想講一下小程序本身的架構,我們做移動開發一般有兩個模式,第一種是web應用,也就是原生應用,還有混合式開發模式這兩種模式,它們的特點都是很鮮明的,比如說web應用,不需要安裝,分享起來很方便,傳播性比較好。原生應用一般需要安裝,而且安裝包的大小不等,幾十兆到幾百兆都很正常。

從開發來講,Web應用是免安裝的,原生應用要安裝,需要專業開發,從開發者技能上來說要求比較高。原生應用由於對開發者要求比較高,它能夠充分利用我們終端的能力,很大的優點是用戶體驗會比較好;小程序是結合了兩種開發模式的優點,首先是免安裝的,一個用戶到微信里面打開小程序,用完就走,不用做什么安裝的動作。

同時,它的開發模式也是一種類web的模式,它的前端和我們的h5的前端很相似,用JS開發起來的成本會簡單很多。用戶體驗上可以媲美原生應用,后面我們會着重分析一下。最重要的一點,小程序是基於微信這個平台的,它會享有微信帶來的便利性,它具備跨平台的開發能力。雖然我們H5的應用一般來說也會具備跨平台的能力,但是H5是基於開發web標准的,有過開發經驗的同學知道,我們的業務規范是一個漫長的過程,理想是美好的,現實是骨感的。但是小程序就沒有這個問題,微信天生是一個社交的軟件,它的傳播性和可分享意義非常好。我們可以通過微信的掃一掃打開小程序,可以通過群聊分享一個小程序,比如最近比較火爆的彈一彈小程序,其實它的傳播度很高。
小程序基本架構和用戶體驗

我們看一下小程序底層的東西和它的用戶體驗,這個圖是小程序的基本架構圖,它的上層分兩塊,一層是是視圖層,也是webviews,另一塊是線程,邏輯層,也就是appService,這兩層在兩個不同的線程里面處理,跟傳統的web有根本的不同。傳統的web渲染的時候,如果邏輯里面有很復雜的處理,往往會導致界面出現卡頓的現象。小程序沒有這個問題,如果沒有調用一些渲染的東西,不會導致你的界面的流暢度下降。由於它們在不同的線程里跑,這兩層不能進行直接的交互,必須通過一些手段,比如有一個中間層去交互,它的基本功能是連接JS的運行環境和底層的系統,系統能力可以實現JS和原生能力的互相調用,兩面的兩層互相通信,用戶觸發某事件以后就會響應Serverless,如果想去更新界面的某一個內容,微信的api通過調用形式展現出來。

這張圖是介紹小程序渲染的一個圖,編譯打包的階段,我們編寫小程序的時候會寫一個類WXML的東西,包含一個WCC的編譯工具,用戶在運行這個小程序的時候,會和你的邏輯層傳入的數據做一個編譯,渲染成最終的界面,這就是最簡單的一個局部更新的過程。

這是小程序加載的幾種簡單的示意圖,小程序在手機加載的時候,要在CDN上面拉一個小程序的包,小程序在手機架構的時候可能有一個等待的時間,當這次安裝包緩存到本地以后,下次再打開時候直接從緩存里面讀取安裝包的內容,如果有新的版本,小程序也不會等新版本更新完了再打開APP,而是直接用上一層緩存的小程序,等你再啟動的時候,使用新的安裝包替換舊的。
冷加載和熱加載的區別
熱加載是小程序推出之后,我們在系統層面實現的東西,小程序跑的線程是在后台運行的,沒有被銷毀的,這個時間大概是5分鍾左右。在這個時間內,你訪問小程序的時候,直接從后台遷到前台,成本相對比較低。

小程序還提供了一個Webview預加載的性能,除了當前看到的Webview的視圖以外,在后台還可以看到一個新的Webview,你切換的時候,因為Webview的初始化時間比較費性能的,在小程序這個級別,如果想達到比較順滑的體驗,需要做一些預處理。
小程序開發者在服務端會面臨的問題
除了保障小程序的流暢性以外,小程序還提供一些原生的組件,有過H5開發經驗的都知道,有時候寫比較長的列表和H5應用,和一些原生應用的對比很明顯,H5的表滑動的時候,特別是對一些老的安卓系統感覺很明顯。既然體驗達不到我的要求,就用原生組件代替Web組件。

小程序為什么這么快?剛才提到了安裝包緩存,分包加載。小程序解決方案進化歷程,小程序是客戶端的一種新的創新,我猜小程序的開發者多半是web前端,或者是終端開發人員,他們可能對小程序的服務端有些欠缺。

我們總結了一下,小程序開發者在服務端會面臨一些問題,比如說要處理很多非業務性的邏輯。舉個例子來說,若處理一個用戶登陸,在小程序這里要考慮會話怎么保存?你和客戶端的協議怎么樣?你還要了解服務器的應用知識,你的服務器怎么配,你的服務器怎么擴容,我的小程序爆款怎么辦?對於一些有開發經驗的開發者來說不是問題,對於更多的客戶端的開發同學,這些都是很棘手的問題,對整個體系要了解。就拿登錄舉個例子,下面這張圖是微信官方提供的登陸流程圖,這個圖看起來有點復雜,如果細致了解就知道它要做什么,有沒有更好的辦法呢?這個圖上的一些難點在這兒,微信登陸的時候,小程序發起的時候到服務器端,怎么做會話的協議?服務器端怎么存?微信提供了一個APP存在哪兒?還有用戶需要保存的,你如果存就會帶來安全問題,用微信推薦的方案,你自己都要去處理。

第二個場景是Websocket信道服務,開發成本高;穩定性難保證;各種異常情況需要考慮,與業務耦合高。
Wafer解決方案
針對這些情況,我們在2016年的時候推出來了一個叫Wafer的解決方案,拿剛才的會話場景來說,我們叫wafer的會話服務器,封裝復雜邏輯,兼顧安全性和便利性,只關注我們提供的幾個接口就行了。我們這個會話服務器,也是支持獨立的,可以方便地做一個橫向的擴展。

針對剛才提到的Websocket,提出一個信道服務器,它是一個paas級的應用,給每個開發者提供唯一的訪問地址,供開發者在程序里面使用,小程序和信用服務器,獲取websocket,然后是到業務服務器。

總結起來有這幾點:配合SDK無需開發,直接使用;平台提供穩定性和性能保障;自動實現斷線重連;獨立信用服務器,消息搬運工。
Wafer架構

這是當時wafer提的一個架構圖,因為我們wafer1當時提出來,是針對企業客戶的,比較看中安全性的擴展性,在這方面做了很多的工作,我們把信道服務器單獨提出來,這個方案現在看起來有點問題,特別是在微信開放,當小程序開發個人注冊之后,它的問題就浮現出來了,比如說架構太不專業了,每一個節點都需要負載均衡,證書也需要自己處理。wafer的服務器需要各個開發者自己去管理,代碼需要自己去部署。

針對wafer1不足之處,我們在2017年上半年提出wafer2的解決方案,它是wafer1的簡化版,把wafer1做了一些簡化合並,兼顧的安全性和便利性,比如說它把會話服務器和業務服務器做了合並;在wafer1時代我們會讓用戶自行部署他的服務器,現在在這兒我們進行托管式的管理,用戶可以購買自己的服務器,但是不需要做服務器端的配置,還會自動免費部署SSL證書,我們和微信做一個深度的合作,把wafer2的解決方案提進微信開發者空間里去。

這個圖是微信開發者工具的界面,右上方有騰訊雲的一些功能和有一些解決方案,比如說上傳代碼到開發環境,使用devtools啟動單步調試等。

針對開發環境我們免費提供免費的域名,一鍵分配運行環境,通過一系列的綁定和關聯之后免費搭起小程序基本的框架。
系統支持針對Node.js遠程調試,試工具集成,支持設置斷點,查看變量值,它的功能很強大,用過的人都說好。
我們也把騰訊雲的一些特點和亮點,以及比較有特色的能力,通過API的形式暴露給小程序開發者,通過一個接口完成身份證識別的功能和圖片OCR的識別功能。
智能語音我們通過API的形式暴露給開發者,你只需要調一個接口,就可以完成語音轉文字的功能。
操作過程
現在介紹一下操作過程,我們使用wafer2把騰訊雲帳號和小程序的帳號做一個關聯,創建一個小程序的號碼,有客戶代碼和服務器代碼。客戶端代碼和服務器代碼的地址,小程序編譯的時候就知道上傳到雲服務器上,這些都是界面的功能,上傳以后還是支持安裝包,以及安裝后重啟的功能。

剛才提到了免費分配域名,需要在客戶端配置域名以后快速的搭建小程序的前后台,按照這個流程來,整個過程大概10分鍾左右。我們也提供了多種demo,供大家了解騰訊雲的使用方法,用到上傳服務器和上傳圖片的功能。


介紹完wafer2之后,我們就在想,我們還能夠做一些什么?因為wafer2為開發者封裝了很多功能,比如說我們的登陸,還有信道服務器,還需要開發者自己部署服務,雖然我們做了一些托管,但是你還要考慮服務器的擴能,或者是負載均衡,我們在想登陸不用自己的服務器就可以登陸,而且直接托管到我們的雲端,能不能不用自己寫服務器的運行環境,直接放在我們的雲函數上面。這也是我們后面一段時間的研究方向。
Q/A
Q:剛才有提到信道服務,如果作為企業的話,數據放在私有雲里面,是不是理解所有的信道服務都放在騰訊雲上面?
A:對的,但是您的數據我們不會存儲的。
Q:剛才wafer2有一個服務器存在的,可以登陸嗎?
A:不可以,自己部署服務器有很多環境的問題。
Q:Node.js和PXP在網上也炒作很厲害,能不能在各個方面做一個比較嗎?最后給一個建議,到底哪個比較好一些?或者Node.js有沒有坑?
A:對於我來說,這兩種語言,我自己是沒有偏好的,我會看開發者的偏好,但是從能力上來說,其實我們在微信開發小程序里面,提供了js的功能,這個問題沒有辦法正面回答你。
Q:如果這兩種方案,Node.js和pxp哪一種比較好?
A:Node.js它是一個比較新的技術架構,Pxp是偏向傳統的,要根據你的業務場景做分析。
更多分享資料,請戳下面的鏈接:
問答
相關閱讀
此文已由作者授權騰訊雲+社區發布,原文鏈接:https://cloud.tencent.com/developer/article/1116776?fromSource=waitui