WebApp與Native App再戰(zhàn)一輪?
歷史的車(chē)輪
Web app向Native app發(fā)起挑戰(zhàn)已經(jīng)有好些年了。以各大公司志向宏大的操作系統(tǒng)為例就有:名噪一時(shí)現(xiàn)在棲身于LG TV的WebOS,Google 力推在教育領(lǐng)域還算混的不錯(cuò)的ChromeOS, Samsung和Intel主導(dǎo)但是一直雷聲大雨點(diǎn)小的Tizen, Mozilla面向低端設(shè)備的FirefoxOS。還有各種開(kāi)發(fā)、打包web/hybrid應(yīng)用的產(chǎn)品:Cordova, Crosswalk,nw.js,Electron。它們也許在各自領(lǐng)域有所成功,但整體的現(xiàn)狀和處境很難說(shuō)Web app對(duì)Native app的世界造成了足夠威脅。
但Web app也在不斷反思和演進(jìn),近來(lái)一系列技術(shù)革新與發(fā)展讓web app成為操作系統(tǒng)頭等公民的目標(biāo)變得不同以往的清晰。讓我們看看“揚(yáng)長(zhǎng)避短”之后的Web app是不是真的可以開(kāi)始跟Native app掰掰手腕了。
“揚(yáng)長(zhǎng)”
Web app之長(zhǎng)首先源自web。Web不是于某家藩籬之內(nèi)的封閉花園,它是一個(gè)任意提供了標(biāo)準(zhǔn)支持的終端都可以平等訪問(wèn)的野蠻生長(zhǎng)的開(kāi)放大草原。Web協(xié)議棧讓全世界的網(wǎng)頁(yè)成為即時(shí)更新并通過(guò)URL相互聯(lián)系的網(wǎng)絡(luò)?;仡橶3C Packaged App(Widget)標(biāo)準(zhǔn)和SysApps(System Application Working Group)的衰落很大程度上也在于放棄了web的這些核心競(jìng)爭(zhēng)力。
Web app之長(zhǎng)也源自HTML,CSS,JavaScript。它們雖然招到很多詬病,但它們也是最廣泛使用的開(kāi)發(fā)工具。而新的ES6,Web Components標(biāo)準(zhǔn)也在讓它們變得具有更強(qiáng)的開(kāi)發(fā)、表達(dá)能力。當(dāng)然HTML的語(yǔ)義話表達(dá)也是搜索的基石之一,這讓web app易于被索引和發(fā)現(xiàn)。
“避短”
Web app之短首先在于能力的缺失。雖然有Cordova之類(lèi)工具架起和native API之間橋梁,但打包之后web app的“長(zhǎng)”呢?所以web標(biāo)準(zhǔn)化組織一方面在努力提供各種硬件訪問(wèn)的接口。另一方面提出了Service Worker來(lái)解決web app本身存在的無(wú)法通過(guò)簡(jiǎn)單增加API來(lái)處理的關(guān)鍵問(wèn)題:
其一,web app缺少在后臺(tái)運(yùn)行的能力,Web Worker可以在后臺(tái)運(yùn)行,但是它依賴(lài)于頁(yè)面,不能在頁(yè)面不存在的時(shí)候運(yùn)行;
其二,通過(guò)URL訪問(wèn)的web 頁(yè)面是彼此孤立的,雖然可以通過(guò)Web Messaging來(lái)相互通信,但是這是一種弱聯(lián)系,并需要消息傳遞之間的頁(yè)面有關(guān)聯(lián)。
Service Worker通過(guò)一個(gè)新的web app編程模型和一套API統(tǒng)一解決了這兩個(gè)問(wèn)題。簡(jiǎn)單的說(shuō)service worker就是一個(gè)生命周期短暫的、事件驅(qū)動(dòng)的后臺(tái)線程,它處理來(lái)自系統(tǒng)和被其控制的頁(yè)面的事件。目前可以通過(guò)Service Worker實(shí)現(xiàn)的功能包括:替代坑坑洼洼的Application Cache的可編程離線緩存,Push Notification(消息推送),Background Sync(后臺(tái)同步)。Service Worker能成為諸多需要跨越頁(yè)面處理能力的入口。比如如果你懷念Web Intents的話,Service Worker也許也能成為它復(fù)活的平臺(tái):通過(guò)Service Worker注冊(cè)某個(gè)intent事件,在事件到來(lái)時(shí)worker被啟動(dòng),針對(duì)不同的intent worker可以選擇打開(kāi)不同的頁(yè)面或重新聚焦某個(gè)已經(jīng)打開(kāi)的頁(yè)面。
輔助以W3C Manifest標(biāo)準(zhǔn),web app有了理論上足以超脫瀏覽器成為系統(tǒng)一部分的能力。
Web app之短也在性能。當(dāng)然性能的問(wèn)題不在于比較和native app跑分一較高下,而在于用戶體驗(yàn)。在JavaScript方面各個(gè)瀏覽器廠商一直在挖掘更高的性能,而近日多個(gè)巨頭同時(shí)參與的Web Assembly的提出更讓業(yè)界更是充滿期望。請(qǐng)想象一下,瀏覽器直接執(zhí)行的游戲引擎代碼是優(yōu)化過(guò)的二進(jìn)制中間表達(dá)形式(IR),甚至是可能是緩存下來(lái)的后端轉(zhuǎn)換過(guò)的機(jī)器碼。另外在渲染引擎方面,60FPS的性能也一直是近一年來(lái)Blink的主要目標(biāo),相信Edge、WebKit等也不會(huì)被拉在后面。
漸進(jìn)式web app
“揚(yáng)長(zhǎng)避短”之后的web app應(yīng)該以一種怎樣的形式進(jìn)入系統(tǒng)并成為系統(tǒng)一員呢?Alex Russell最近就提出了一種漸進(jìn)式web app的理念,而且這一理念已經(jīng)可以在Android上看到萌芽。
在Android Chrome上通過(guò)搜索或者鏈接發(fā)現(xiàn)了并使用了某個(gè)頁(yè)面。當(dāng)這個(gè)頁(yè)面或者某個(gè)域范圍內(nèi)的頁(yè)面在一定時(shí)間內(nèi)被多次訪問(wèn)后,瀏覽器會(huì)認(rèn)為這些網(wǎng)頁(yè)是可以被升級(jí)成app的,并彈出對(duì)話框讓用戶選擇是否安裝這個(gè)web app到系統(tǒng)。這個(gè)web app可以享有和native app類(lèi)似的權(quán)利,比如主界面啟動(dòng),獨(dú)立的應(yīng)用選擇欄。目前在Chrome上指定了只有使用了Service Worker 和 Manifest 的網(wǎng)頁(yè)能夠升級(jí)成web app被安裝,用來(lái)保證app的質(zhì)量。
這種漸進(jìn)式web app的理念在我看來(lái)可以用人和人的交往來(lái)類(lèi)比,一個(gè)人從陌生,到熟悉,再到相信。展開(kāi)想象,是不是web app的權(quán)限管理也可以漸進(jìn)呢? 安全、隱私級(jí)別高的API訪問(wèn)控制會(huì)隨著你對(duì)這個(gè)app的相信程度來(lái)適配。
總結(jié)
各種web操作系統(tǒng)和hybrid打包工具已經(jīng)向native app主導(dǎo)的世界發(fā)起了挑戰(zhàn),隨著web技術(shù)的進(jìn)一步成熟,open web也逐漸能通過(guò)漸進(jìn)的方式像native app一樣成為系統(tǒng)的一部分。我期望著某一天自由、平等、開(kāi)放的web能成為開(kāi)發(fā)者的***平臺(tái)。