比如,大量的內(nèi)容網(wǎng)站,其文章內(nèi)容都是存儲(chǔ)為一個(gè) Html 片段的,這樣就無(wú)法直接呈現(xiàn)在小程序中。如果需要展示,一個(gè)思路是構(gòu)建一個(gè)中間服務(wù),將 Html 轉(zhuǎn)譯成一種更簡(jiǎn)單利于渲染的中間格式數(shù)據(jù),然后,在小程序端把中間格式的數(shù)據(jù)轉(zhuǎn)換成小程序的標(biāo)簽進(jìn)行呈現(xiàn)。我們?cè)谧?[輕芒生活](http://s.qingmang.mobi/10c) 的時(shí)候,正好設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)轉(zhuǎn)義服務(wù),將任意一個(gè) Html 頁(yè)面轉(zhuǎn)換成中間格式(內(nèi)部名是 RAML),解決了內(nèi)容性 Html 頁(yè)在小程序上的呈現(xiàn)問(wèn)題。
(在小程序中呈現(xiàn) Html 內(nèi)容頁(yè))
和 Html 相比,小程序的 **WXSS** 算是比較完整的保留了 CSS 的特征,這一點(diǎn)還蠻出乎意料的。WXSS 在語(yǔ)義上***的不同,一是在于它支持了相對(duì)尺寸單位 `rpx` ,每 750rpx 等價(jià)于當(dāng)前設(shè)備的屏幕寬度。這個(gè)相對(duì)尺寸單位的引入,把那種繁復(fù)的屏幕尺寸適配變得簡(jiǎn)單了不少。而和 CSS 的另一個(gè)不同,是它更像傳統(tǒng)控件樣式用法,不支持 CSS3 那么多的選擇器,使用中,更多的是一個(gè)控件一個(gè) class 這樣來(lái)使用。
小程序中雖然支持 ES6 標(biāo)準(zhǔn)的 Javascript,但窗口級(jí)的 Javascript 在小程序中完全被廢棄掉了,開(kāi)發(fā)者無(wú)法用 Javascript 去調(diào)用 window、document 對(duì)象來(lái)修改界面元素完成邏輯。小程序中的 Javascript 其實(shí)直接對(duì)應(yīng) node.js 的用法,用來(lái)完成后臺(tái)業(yè)務(wù)邏輯,而不是直接控制交互。小程序的這個(gè)設(shè)計(jì),使其可以用到 virtual dom 的方式來(lái)渲染界面,讓界面數(shù)據(jù)更新時(shí)的性能優(yōu)化成為可能,但付出的代價(jià)就是少了窗口級(jí) Javscript 的那層膠水的黏合,使得很多功能的開(kāi)發(fā)變得極其呆板和繁復(fù)。
交互如何傳導(dǎo)?
所謂交互的傳導(dǎo),是當(dāng)用戶和界面發(fā)生交互式,平臺(tái)框架通過(guò)何種方式告訴業(yè)務(wù)層,并將處理后的變化呈現(xiàn)回交互界面上。如果把 WXSS + WXML 繪制的頁(yè)面看成 “前端”,把 Javascript 撰寫的業(yè)務(wù)邏輯看成 “后端”,你會(huì)發(fā)現(xiàn),小程序的前后端交互特別像 Web 1.0 的模式,前端把交互行為封裝成 **事件(event)** 發(fā)送到后端,后端處理完成后,通過(guò) **setData** 方法將數(shù)據(jù)回傳到前端。
(小程序的交互傳導(dǎo))
小程序提供的 Events,基礎(chǔ)的有類似單擊、長(zhǎng)按、觸摸、滑動(dòng),等等,對(duì)于視頻播放器等控件,還有監(jiān)聽(tīng)播放、暫停等等。這些事件涵蓋算是比較基礎(chǔ)的,沒(méi)有更高級(jí)的手勢(shì)、多點(diǎn)觸控等相關(guān)事件,但也還是足夠讓開(kāi)發(fā)者具體了解用戶的輸入,進(jìn)而做出響應(yīng)。
而小程序給界面相應(yīng)的唯一方式,是通過(guò) Page 中的 setData API 對(duì)界面上的數(shù)據(jù)進(jìn)行更新, **小程序會(huì)比較兩次調(diào)用期間數(shù)據(jù)的變化** ,來(lái)決策需要更新哪部分的交互界面。
舉個(gè)實(shí)際的例子,假設(shè)開(kāi)發(fā)者需要做一個(gè)滑動(dòng)切換頁(yè)面的效果,在小程序中該如何實(shí)現(xiàn)?首先,是將變量數(shù)據(jù)引入渲染頁(yè)面:
可以看到, `distance` 是一個(gè)模版參數(shù),它初始值為 0,表示移動(dòng)的距離。通過(guò) **bindtouchstart** 等函數(shù)綁定上 Javascript 的方法,將事件回傳。
- movePage: function(event) {
- var status = {
- needUpdate: false,
- distance: 0
- }
- // 處理各種事件,計(jì)算是否需要刷新,和移動(dòng)方向
- if ("touchstart" === event.type) {
- // 開(kāi)始計(jì)算移動(dòng)
- ...
- } else if ("touchend" === event.type) {
- // 判定移動(dòng)的距離是否足夠.
- ...
- } else if ("touchcancel" === event.type) {
- // 被打斷就算了.
- ...
- } else if ("touchmove" === event.type) {
- // 計(jì)算移動(dòng)距離
- ...
- }
- // 根據(jù)移動(dòng)的距離,來(lái)更新界面
- if (status.needUpdate) {
- this.setData({
- distance: status.distance
- })
- }
- }
而在 Javascript 一端,則捕獲事件、計(jì)算偏移量,然后將新的偏移量送到前端界面。
從這里可以看到,小程序的交互模式,是典型的單向模式,前端回傳事件,數(shù)據(jù)單向的推到前端,而不是通過(guò)類似 “變量” “狀態(tài)” 這樣的方式來(lái)告知。這樣的模式下,開(kāi)發(fā)者對(duì)界面變化的控制往往不可能太精準(zhǔn),整個(gè)核心,都依賴小程序?qū)纱螖?shù)據(jù)變化的 diff 計(jì)算,這個(gè)會(huì)最終影響整個(gè)交互的性能。
小程序開(kāi)發(fā)模式的特點(diǎn)
至此,我們可以來(lái)總結(jié)一下小程序開(kāi)發(fā)的一些特點(diǎn)了。整體來(lái)看,小程序是借了 Html5 的技術(shù)棧,行了傳統(tǒng)客戶端開(kāi)發(fā)的模式,這一點(diǎn)和 React 等平臺(tái)會(huì)比較相近,可以視為 HTMLl5 的一個(gè)新分支。
從設(shè)計(jì)思路看,小程序做了大量的 “限制”,***的限制,是開(kāi)發(fā)者其實(shí)是無(wú)法通過(guò) Javascript 這樣的編程語(yǔ)言,直接對(duì)界面進(jìn)行控制,而是通過(guò)數(shù)據(jù)驅(qū)動(dòng)來(lái)間接實(shí)現(xiàn)。這對(duì)于缺少開(kāi)發(fā)經(jīng)驗(yàn)的人而言,是有益的事情,因?yàn)檫@降低了理解的門檻,但對(duì)于復(fù)雜的應(yīng)用而言,這個(gè)模式開(kāi)發(fā)起來(lái)比較呆板,往往是一個(gè)變化多處修改,增加了理解代碼的成本。
開(kāi)發(fā)小程序的坑
開(kāi)發(fā)小程序的日子,也是一個(gè)踩坑的歷程。簡(jiǎn)單總結(jié),小程序中的坑大概來(lái)自這幾個(gè)方面:
和 Web 的兼容性。小程序引入了 Html/CSS 做為技術(shù)棧,并在其基礎(chǔ)上進(jìn)行了定制。很多開(kāi)發(fā)中的問(wèn)題都來(lái)自于 “定制”,因?yàn)槟悴⒉恢滥牟糠志捅欢ㄖ屏?,哪部分是被繼承了。比如,你用了一個(gè) CSS 語(yǔ)法,發(fā)現(xiàn)并不生效,或者效果和瀏覽器中的不一樣,于是,你只能換一個(gè)寫法,結(jié)果很有可能,又會(huì)繼續(xù)發(fā)現(xiàn),這個(gè)新的寫法可能效果也不對(duì),于是你只能繼續(xù)嘗試,如此反復(fù),可能會(huì)消耗大量的時(shí)間。
開(kāi)發(fā)環(huán)境不穩(wěn)定。小程序的開(kāi)發(fā),是基于微信自制的一個(gè) IDE,但當(dāng)下,IDE 的穩(wěn)定性、易用性都非常之差,時(shí)常出現(xiàn) Bug,你以為是你的程序?qū)戝e(cuò)了,但其實(shí),是 IDE 的 Bug,重啟一下 IDE,一切都引刃而解了。于是,當(dāng)你日后開(kāi)發(fā)小程序時(shí)出現(xiàn)某種異樣,先重啟 IDE,再看問(wèn)題還在不在,也許是種更節(jié)省時(shí)間的方式。
缺少真機(jī)調(diào)試環(huán)境。小程序的運(yùn)行時(shí)其實(shí)就是微信,微信幾乎沒(méi)提供任何真機(jī)上調(diào)試工具給你(也不能說(shuō)完全沒(méi)有,有一個(gè)只能在真機(jī)上瞪著眼睛看的日志框)。你在模擬器中調(diào)試好的程序,可能在真機(jī)上運(yùn)行起來(lái)并不如預(yù)期。比如,我們碰到過(guò)真機(jī)上白屏、位置錯(cuò)亂、動(dòng)畫效果不對(duì),以及 Android 上至今還不能運(yùn)行,等等問(wèn)題。這對(duì)于稍微復(fù)雜的程序而言,頗為夢(mèng)魘,想做一些細(xì)粒度的調(diào)整和優(yōu)化,基本只能靠猜。
閉源且缺少學(xué)習(xí)資料。小程序整體上是閉源狀態(tài)(雖然模擬器和 IDE 部分可以通過(guò)反編譯來(lái)看),且缺少足夠的學(xué)習(xí)資料,如果一旦碰到控件如何使用、為什么這么用不對(duì),之類的問(wèn)題,就只能靠不停的試來(lái)解決,也需要耗費(fèi)大量時(shí)間。
***介紹下「輕芒小程序+」?!篙p芒小程序+」是由輕芒團(tuán)隊(duì)提出的小程序解決方案,它將替內(nèi)容創(chuàng)業(yè)者免費(fèi)搭建屬于自己的微信小程序,其創(chuàng)建的小程序在內(nèi)容發(fā)布之外,還將具有評(píng)論、筆記、付費(fèi)閱讀等特色功能。輕芒小程序+ 不打算創(chuàng)建一個(gè)新的內(nèi)容平臺(tái),而是將內(nèi)容創(chuàng)業(yè)者現(xiàn)有的自媒體賬號(hào)轉(zhuǎn)化成微信小程序。內(nèi)容創(chuàng)業(yè)者只要照常更新自媒體,這些內(nèi)容就能自動(dòng)更新到小程序。
簡(jiǎn)而言之,做為一個(gè)新的開(kāi)發(fā)平臺(tái),微信小程序從本身的穩(wěn)定性,以及配套的工具鏈上都不算完善,這對(duì)于早期開(kāi)發(fā)者而言,需要耗費(fèi)額外精力去嘗試和探索,但這也許就是一個(gè)新平臺(tái)的價(jià)值和代價(jià)吧。
名稱欄目:通過(guò)編程模式起底小程序開(kāi)發(fā)技術(shù)特點(diǎn)
文章鏈接:http://www.dlmjj.cn/article/dpsodds.html


咨詢
建站咨詢

