小程序也屬于App的一種,那么它和我們現(xiàn)在流行的原生App(iOS、Android)相比,有什么區(qū)別和優(yōu)勢(shì)呢?
首先,從技術(shù)上來(lái)講,目前App的主流開(kāi)發(fā)方式有三種:Web App、Native App和Hybrid App。我們舉幾個(gè)例子來(lái)看看:
·Web App
在微信“發(fā)現(xiàn)”里面有一個(gè)“購(gòu)物”入口,點(diǎn)擊進(jìn)去打開(kāi)的是京東的移動(dòng)購(gòu)物頁(yè)面,這個(gè)頁(yè)面實(shí)際上就是一個(gè)Web App。支付寶的眾多小服務(wù)也是Web App,還有“海底撈”在微信中的排號(hào)應(yīng)用,這類App其實(shí)就是我們經(jīng)常在PC上瀏覽的網(wǎng)頁(yè),只不過(guò)加入了響應(yīng)式的設(shè)計(jì)讓它適合在移動(dòng)端顯示和運(yùn)行,所采用的技術(shù)依然是JavaScript、CSS和HTML。相對(duì)于其他兩種App,Web App具有開(kāi)發(fā)簡(jiǎn)單、高效,更新靈活、跨平臺(tái),大量的網(wǎng)頁(yè)應(yīng)用稍作調(diào)整即可放在移動(dòng)端運(yùn)行。但缺點(diǎn)與優(yōu)點(diǎn)并存,Web App性能、體驗(yàn)極差(對(duì),是極差),無(wú)法使用照相機(jī)、系統(tǒng)通知、本地緩存等原生特性。
·Native App
也稱為原生App。這種App不是采用JavaScript、CSS及HTML開(kāi)發(fā),而是使用Objective-C(iOS)或者Java(Android)開(kāi)發(fā)。微信、支付寶、斗魚(yú)TV等都屬于這類App,是目前主流的開(kāi)發(fā)方式。Native App具有性能、體驗(yàn)非常良好,組件支持完善、接口豐富等特點(diǎn)。但Native App最大的缺點(diǎn)在于,不能跨平臺(tái),有多少個(gè)平臺(tái)就要開(kāi)發(fā)多少個(gè)版本,現(xiàn)在主要有iOS和Android兩個(gè)主流平臺(tái),還好Windows Phone已沒(méi)了蹤影。
·Hybrid App
也稱為混合式App。Hybrid App看上去像一個(gè) Native App,但實(shí)質(zhì)上 Native技術(shù)在這里只是作為一個(gè)容器,將 Web App包裹了起來(lái),在容器內(nèi)部實(shí)質(zhì)上運(yùn)行的還是網(wǎng)頁(yè)。 Hybrid App更像是Web App與Native App的混合體。與純粹的Web App相比,Hybrid App會(huì)有一部分訪問(wèn)原生組件(相機(jī)、加速器)的能力。事實(shí)上,目前主流的應(yīng)用中,純粹的原生App很少,絕大多數(shù)都屬于混合式App。比如,我們常見(jiàn)的京東、淘寶等電商類App,由于商品及業(yè)務(wù)變化非常頻繁,需要經(jīng)常調(diào)整,所以這類App的主要頁(yè)面都是采用Web技術(shù)來(lái)構(gòu)建,只是用Native包裝了一下。那我們?nèi)绾谓缍?,哪些App屬于“原生”哪些App屬于“混合”呢?答案是:看Web頁(yè)面在App中所占的比例,如果絕大多數(shù)頁(yè)面都采用Web技術(shù)構(gòu)建,那么我們稱為混合式App;而如果只有少數(shù)頁(yè)面采用Web技術(shù),我們稱為原生應(yīng)用。舉個(gè)例子,今日頭條這類新聞應(yīng)用中絕大多數(shù)頁(yè)面都采用原生技術(shù)實(shí)現(xiàn),我傾向于稱它為Native App;而對(duì)于淘寶、京東等App,更傾向于是Hybrid App。Hybrid App具有接近于 Native App的體驗(yàn)、開(kāi)發(fā)效率高、跨平臺(tái)等特性。
有一些開(kāi)發(fā)者認(rèn)為微信服務(wù)號(hào)里的網(wǎng)頁(yè)應(yīng)用也屬于Hybrid App,這種說(shuō)法也不無(wú)道理。因?yàn)檫@些網(wǎng)頁(yè)應(yīng)用也屬于微信這個(gè)Native應(yīng)用的一部分,同樣運(yùn)行在微信內(nèi)置的瀏覽器中,但這是一個(gè)App所有者的問(wèn)題。對(duì)于微信,確實(shí)是Native App中加入了部分“網(wǎng)頁(yè)”,具有Hybrid App的特點(diǎn)。但我們上面講到,目前主流App里很少有純粹的Native App,是不是算作Hybrid App,應(yīng)該看Web頁(yè)面在App中的所占比例。微信是一個(gè)以社交為主要業(yè)務(wù)的App,微信中的絕大多數(shù)核心社交與聊天功能都是原生的,所以我們還是稱微信為Native App。但是,對(duì)于服務(wù)號(hào)應(yīng)用的開(kāi)發(fā)者,微信并不是開(kāi)發(fā)者開(kāi)發(fā)的,開(kāi)發(fā)者只擁有其服務(wù)號(hào)。而且服務(wù)號(hào)應(yīng)用所用到的所有技術(shù)都只局限在Web技術(shù)里,從這一點(diǎn)來(lái)講,服務(wù)號(hào)的應(yīng)用應(yīng)該歸屬于Web App的范疇。
此外,我們說(shuō)Hybrid App具有一部分可以訪問(wèn)原生設(shè)備組件的能力。微信的JS-SDK確實(shí)提供了一些如拍照、錄音、掃一掃等功能的接口,但相比于其他Hybrid App能調(diào)用的原生功能,實(shí)在是有限。從這個(gè)角度來(lái)講,也應(yīng)該將這些服務(wù)號(hào)的應(yīng)用歸屬到Web App中。
其實(shí),到底歸屬于什么并不重要?;ヂ?lián)網(wǎng)技術(shù)中的概念層出不窮,對(duì)很多事物的定義本來(lái)就不是很明確。這里用一些篇幅解釋3種主流類型的App,是希望大家在對(duì)比小程序和其他類型App時(shí),能有一個(gè)較完整的知識(shí)背景。
那么小程序?qū)儆谝陨?種的哪一種?嚴(yán)格意義上來(lái)說(shuō),它不屬于以上3種中的任何一種,在實(shí)現(xiàn)技術(shù)上小程序同傳統(tǒng)的Hybrid還是有很大的不同的。小程序采用Java Script和CSS這類常見(jiàn)的Web技術(shù)開(kāi)發(fā),但它又不使用HTML,它同Web沒(méi)有直接的聯(lián)系。小程序?qū)嶋H上是將一系列自己定義的組件編譯成了對(duì)應(yīng)平臺(tái)(iOS、Android、PC)的相應(yīng)可運(yùn)行組件,以提高運(yùn)行性能。如果一定要將小程序歸并到以上3類App中,可能Hybrid App更合適:非原生,但使用到了Web技術(shù)(JavaScript和CSS)。
相比于Native App,小程序具有Hybrid App的一些優(yōu)勢(shì):
·跨平臺(tái)(對(duì)于iOS和 Android兩個(gè)平臺(tái)只需要開(kāi)發(fā)一套程序)。
·具備接近于Native App的體驗(yàn)(注意只是接近)。
·對(duì)原生組件有訪問(wèn)能力。
·具備緩存能力。
·上手容易,開(kāi)發(fā)邏輯較為簡(jiǎn)單。
同時(shí),小程序還具有一些它獨(dú)有的特點(diǎn):
·小程序在設(shè)計(jì)時(shí)就做了很多約定式的規(guī)范:比如簡(jiǎn)單的文件結(jié)構(gòu)、默認(rèn)的文件命名、內(nèi)置好的Tab欄與導(dǎo)航欄等,這讓小程序的初學(xué)者更容易上手和理解。
·開(kāi)發(fā)環(huán)境很干凈,你無(wú)須安裝任何除開(kāi)發(fā)工具外的其他軟件。當(dāng)然現(xiàn)在這個(gè)工具簡(jiǎn)陋的可怕,很多常見(jiàn)的IDE功能都不具備,但相比于其他Hybrid App的環(huán)境要求,小程序這點(diǎn)真的很棒。
·發(fā)布和部署流程非常簡(jiǎn)單,幾乎是“傻瓜式”,點(diǎn)擊幾下就可以將應(yīng)用發(fā)布到騰訊云。
·小程序之所以在公布后引起了互聯(lián)網(wǎng)圈兒和開(kāi)發(fā)者們極高的關(guān)注度,原因并不在技術(shù)上,無(wú)數(shù)開(kāi)發(fā)者、創(chuàng)業(yè)者看中的是微信天然的關(guān)系鏈與獲客能力。這也是小程序最大的優(yōu)勢(shì)。
但是,世間沒(méi)有完美的事物,計(jì)算機(jī)世界里也沒(méi)有完美的技術(shù),你以為的優(yōu)勢(shì)在另一方面卻成了缺點(diǎn)。我們一起來(lái)看下:
·小程序?yàn)榱撕?jiǎn)化復(fù)雜性,做了一些UI上的設(shè)計(jì)規(guī)范,確實(shí)方便了很多對(duì)UI要求不高的應(yīng)用。但這也限制了那些對(duì)UI要求極高的產(chǎn)品發(fā)揮。
·小程序很遺憾地不支持現(xiàn)有的HTML DOM結(jié)構(gòu),而是自己給出了一系列的組件,造就了一個(gè)封閉的開(kāi)發(fā)環(huán)境,這直接導(dǎo)致了現(xiàn)有的經(jīng)典Java Scripti框架、類庫(kù)都無(wú)法使用。小程序現(xiàn)在的生態(tài)幾乎是荒蕪一片,等待著開(kāi)發(fā)者們?nèi)ジ牛ㄌ魬?zhàn)與機(jī)遇并存,正因?yàn)闆](méi)有,才有機(jī)會(huì))。如果你想用小程序?qū)崿F(xiàn)一組圖形來(lái)展現(xiàn)股票或者天氣的曲線,目前來(lái)看,相當(dāng)煩瑣。你無(wú)法使用經(jīng)典的eckart或者h(yuǎn)ighchart,你只能自己用Canvas來(lái)一點(diǎn)點(diǎn)地繪制。
·截至至今,小程序還不支持Web View,這是相當(dāng)頭疼的一個(gè)問(wèn)題?,F(xiàn)在很多新聞?lì)愋偷膽?yīng)用,都是將文章數(shù)據(jù)靜態(tài)化成HTML存儲(chǔ)在服務(wù)器或者是CDN中,然后再利用Web View直接加載這個(gè)HTML來(lái)顯示。不支持Web View直接導(dǎo)致了很多內(nèi)容型應(yīng)用沒(méi)辦法加載已存在的大量HTML頁(yè)面。內(nèi)容型應(yīng)用現(xiàn)在大量的靜態(tài)化頁(yè)面需要被轉(zhuǎn)化(已有一些第三方的組件實(shí)現(xiàn)了HTML轉(zhuǎn)WXML,基本思路是用正則表達(dá)式替換HTML,但效果并不能讓人滿意)。至于微信會(huì)不會(huì)官方支持,這個(gè)很難抉擇。不支持Web View對(duì)現(xiàn)在的靜態(tài)化HTML頁(yè)面是致命的打擊;但兼容Web View就意味著在小程序里你還可以運(yùn)行Web App,而Web App很難去監(jiān)管,性能體驗(yàn)也不夠好,這對(duì)于小程序的發(fā)展是不利的。也許開(kāi)放一個(gè)只解析CSS不允許運(yùn)行JavaScript的Web View可能是個(gè)不錯(cuò)的選擇,微信如何平衡這個(gè)問(wèn)題,我們拭目以待。
·小程序只實(shí)現(xiàn)了模板化并沒(méi)有實(shí)現(xiàn)自定義組件,這是最令人不滿意的地方。如果我們想實(shí)現(xiàn)一個(gè)自定義邏輯的組件,通常希望把這個(gè)組件的標(biāo)簽、樣式以及業(yè)務(wù)邏輯打包在一起,然后可以放在項(xiàng)目中多個(gè)地方使用。外部客戶端調(diào)用組件時(shí),只需要傳入組件所需要的參數(shù),由組件自己來(lái)完成數(shù)據(jù)獲取、轉(zhuǎn)化、綁定并和UI層通信等操作。但小程序里的template只能將標(biāo)簽和樣式(WXML和WXss文件)提取出來(lái)作為一個(gè)模板”,卻無(wú)法把組件的業(yè)務(wù)邏輯(js文件)放在一起。也就是說(shuō),組件的業(yè)務(wù)邏輯不能夠?qū)懺诮M件的模塊兒中,只能寫(xiě)在“調(diào)用”組件的業(yè)務(wù)代碼中,這就無(wú)法很好地復(fù)用組件的業(yè)務(wù)代碼。
我們用表格來(lái)對(duì)比小程序和現(xiàn)在主流App的優(yōu)劣勢(shì)。