有人說(shuō)小程序是原生應(yīng)用,不知道是現(xiàn)在什么立場(chǎng)這樣說(shuō)的,微信內(nèi)嵌web view 控件,本質(zhì)上就是一個(gè)定制化的web瀏覽器,與普通瀏覽器相比只是增加了一些豐富的內(nèi)部交互,比如可以輕松用戶信息等等,雖然站在前端的角度,小程序和H5應(yīng)用有一點(diǎn)區(qū)別,但是虛擬機(jī)永遠(yuǎn)是虛擬機(jī),跟原生永遠(yuǎn)差了一個(gè)解釋執(zhí)行的鴻溝。還提到了自更新,只要你是基于HTTP協(xié)議的那就是古老的HTTP REQUEST 和 RESPONSE方式,沒(méi)有什么值得吹捧的。如果答主稍微對(duì)Native了解深一點(diǎn),可能就會(huì)拿application stream來(lái)說(shuō)了,這才是目前解決Native程序分發(fā)方式的一大方向,ctrix 有application 虛擬化,Google有dynamrio,微軟有drawbridge,這些技術(shù)含量可比react或者codepush技術(shù)含量高多了。一個(gè)是接近OS級(jí)別的革新,一個(gè)是虛擬機(jī)里面的優(yōu)化,層次高低,技術(shù)深度不言自明。虛擬機(jī)永遠(yuǎn)是虛擬機(jī),玩不出花來(lái)。不過(guò)如今的CPU架構(gòu)也是發(fā)展了幾十年而沒(méi)有大的改變,這也制約了native程序的基本運(yùn)行原理。-----------------技術(shù)上沒(méi)什么區(qū)別,但是在意義上小程序是騰訊實(shí)現(xiàn)“成為互聯(lián)網(wǎng)的水和電”這一企業(yè)愿景的堅(jiān)實(shí)而正確的一步。很普通的技術(shù),但是放到騰訊的平臺(tái)中,都可以因?yàn)榱孔円鹳|(zhì)變。比如公眾號(hào),其實(shí)就是增加了主動(dòng)Push的RSS訂閱一樣的技術(shù)。應(yīng)該沒(méi)有什么下載不下載,最多是給你在手機(jī)桌面添加一個(gè)自定義scheme的hyper link的快捷方式,打開(kāi)以后也是直接切換到微信內(nèi)置的Webview控件。
首先明確幾個(gè)概念:
Runtime,運(yùn)行時(shí)環(huán)境。
所謂 runtime 就是能夠運(yùn)行我們寫(xiě)的代碼的代碼。說(shuō)來(lái)很繞,理解起來(lái)很簡(jiǎn)單——我們寫(xiě)的代碼是要運(yùn)行在一個(gè)特定的環(huán)境中的,這個(gè)環(huán)境負(fù)責(zé)具體執(zhí)行代碼所表示的指令,也就是說(shuō)代碼最終能有什么樣的能力、能實(shí)現(xiàn)什么樣的效果,不取決于怎么寫(xiě),而取決于 runtime 怎么理解和執(zhí)行。
比如,你用 console.log('Hello World'); 想在控制臺(tái)里輸出「Hello World」,如果 runtime 就是要把「Hello World」轉(zhuǎn)換成「Vote for Trump」你也沒(méi)有任何辦法。HTML,特指符合 W3C HTML Specification 的標(biāo)記語(yǔ)言,包括 4.01、5、5.1 等等眾多版本。并不是用「< 」和「>」符號(hào)包起來(lái)的就都叫 HTML,比如 <吃飯></吃飯>。CSS,特指符合 W3C Cascading Style Sheets Specification 的樣式描述語(yǔ)言,包括 Level 1、2、3、4 等眾多版本。網(wǎng)頁(yè)技術(shù)、web 技術(shù)——隨便怎么叫,特指用 JavaScript、HTML、CSS 幾種技術(shù)構(gòu)建應(yīng)用,最終運(yùn)行在「瀏覽器」這個(gè)特定 runtime 中的技術(shù)。瀏覽器(中的 JavaScript 引擎)和 Node.js(中的 JavaScript 引擎) 都只是 runtime 的一種——它們決定了我們的 JavaScript 代碼能做什么,有什么樣的能力供我們使用。window.alert('Hello World') 就只有瀏覽器能理解,同樣 require('fs').readFile('/'); 也只有 Node.js 能明白是什么意思。微信小程序是眾多實(shí)現(xiàn)了 JavaScript(MAYA、3DS MAX、Nginx 以及某些游戲引擎也有) runtime 的環(huán)境中的一種。瀏覽器作為一個(gè) runtime 的另一個(gè)重要特點(diǎn)是有 UI 繪制和用戶交互行為的捕獲能力——(曾經(jīng))只有瀏覽器能識(shí)別用 HTML 和 CSS 描述的 UI 結(jié)構(gòu)和樣式,并捕獲用戶的輸入傳遞給 JavaScript 進(jìn)行相應(yīng)的處理。小程序也有 UI 繪制和用戶交互行為的捕獲能力,但嚴(yán)格來(lái)講,它并不能識(shí)別 HTML 和 CSS,對(duì)應(yīng)的,它使用 WXML 和 WXSS 兩種標(biāo)準(zhǔn)來(lái)解釋標(biāo)記語(yǔ)言和樣式描述,而標(biāo)準(zhǔn)由微信小程序自己制定。HTML 和 WXML 有交集、CSS 和 WXSS 有交集,但他們是不同的。Runtime 能理解我們寫(xiě)的標(biāo)記語(yǔ)言、樣式描述和業(yè)務(wù)代碼了,接下來(lái)需要去執(zhí)行它們。而問(wèn)題里提到的當(dāng)年 Facebook 的客戶端,使用的是 Hybrid 解決方案——就是在平臺(tái)原生應(yīng)用的外殼里嵌入一個(gè) webview,它能提供基于 HTML、CSS 和 JavaScript 這些技術(shù)構(gòu)建的應(yīng)用所需的 runtime,因?yàn)樗鋵?shí)就是一個(gè)閹割的瀏覽器,不提供前進(jìn)后退按鈕、書(shū)簽管理等等,只提供運(yùn)行環(huán)境和繪制 UI 的能力。Hybrid 解決方案繼承了所有 web 技術(shù)的優(yōu)點(diǎn)——跨平臺(tái)、易維護(hù)、易部署和開(kāi)發(fā)成本低等,同時(shí)也繼承了所有缺點(diǎn),而其中最為人詬病的缺點(diǎn)就是——安裝包體積大(由于兼容性問(wèn)題,很多應(yīng)用不想使用用戶設(shè)備自帶的瀏覽器環(huán)境,而選擇打包一個(gè)瀏覽器核心在自己安裝包里),以及 UI 繪制效率低。嚴(yán)格來(lái)講,所有最終放棄 Hybrid 解決方案的公司,都不是由于過(guò)分相信 HTML 5 和 JavaScript,而是對(duì)移動(dòng)設(shè)備上的瀏覽器的核心部分(webview)的性能,特別是 UI 繪制性能,過(guò)分樂(lè)觀了。時(shí)間推移到 2015 年前后,開(kāi)始出現(xiàn)了以 ReactNative 和 Weex 等技術(shù)方案為代表的新型技術(shù)解決方案,而小程序單純從技術(shù)實(shí)現(xiàn)角度來(lái)講,同這些技術(shù)方案差異不大——提供 JavaScript 的 runtime,用某種同 HTML 相似的結(jié)構(gòu)化標(biāo)簽語(yǔ)言來(lái)描述 UI 結(jié)構(gòu),用某種類似 CSS 的語(yǔ)言來(lái)描述 UI 樣式,然后將這些代碼直接繪制為原生 UI。這個(gè)過(guò)程中已經(jīng)沒(méi)有 webview 什么事情了,所以微信小程序并不是我們平時(shí)所說(shuō)的 web 技術(shù),他們只是使用一樣或類似的語(yǔ)言而已(總不能說(shuō)在 MAYA 里寫(xiě) JavaScript 腳本也叫 web 開(kāi)發(fā)吧?)。客戶端開(kāi)發(fā)的核心是通過(guò) runtime 來(lái)調(diào)度和控制 runtime 之下的平臺(tái)能力,瀏覽器這個(gè) runtime 下面的平臺(tái)是操作系統(tǒng)(Windows、macOS、iOS、Android、*nix 等),而小程序這個(gè) runtime 下面的平臺(tái)是微信,這是二者的本質(zhì)區(qū)別。再說(shuō)下載。以前,網(wǎng)頁(yè)的所有內(nèi)容必須要先下載再執(zhí)行,而近些年瀏覽器提供了離線緩存的相關(guān)功能,讓網(wǎng)頁(yè)應(yīng)用的非數(shù)據(jù)部分可以離線使用,但這樣會(huì)把問(wèn)題復(fù)雜度直接拉成指數(shù)級(jí)提升——以前默認(rèn)所有東西都要連網(wǎng)才能使用,現(xiàn)在要區(qū)分哪些可以連、哪些必須連、連上怎么處理、連不上怎么處理、要緩存的話緩存策略怎么設(shè)置,產(chǎn)品和技術(shù)上面臨的問(wèn)題都太多,收益也未必有多大,如果離線使用是剛需還不如索性直接做 app,所以瀏覽器內(nèi)的離線應(yīng)用發(fā)展一直不溫不火,但如果你真心想做,還是可以實(shí)現(xiàn)首次下載后再次使用速度得到質(zhì)的提升的。所以問(wèn)題描述的慢,下載慢并不是癥結(jié),UI 繪制慢、交互響應(yīng)慢(得益于 JavaScript 引擎本身的性能提升,連 JavaScript 執(zhí)行都不是瓶頸了,但占用 UI 線程導(dǎo)致整體卡頓是另外一個(gè)話題)才是根本問(wèn)題,而這是瀏覽器本身的實(shí)現(xiàn)原理導(dǎo)致的。小程序也需要在首次加載的時(shí)候把應(yīng)用相關(guān)的代碼(當(dāng)然資源大小可能有差異)下載下來(lái),這同網(wǎng)頁(yè)沒(méi)區(qū)別,而性能的提升體現(xiàn)在后面同 UI 相關(guān)的效率上,從這個(gè)角度講也不是什么新鮮事兒了,ReactNative、Weex 都是類似的原理和訴求。
所以需不需要下載,并不是兩種技術(shù)之間相比在性能上的主要差異。小程序的價(jià)值不是在技術(shù)上,而是在能否通過(guò)它來(lái) leverage 整個(gè)微信生態(tài)及附屬其上的相關(guān)資源。這就要涉及到小程序作為 runtime 到底給接入商提供什么樣的能力、多大程度的把微信生態(tài)的資源暴露給開(kāi)發(fā)者、入口位置、限制上等等,這就取決于微信自己的生態(tài)策略了。瀏覽器作為開(kāi)放標(biāo)準(zhǔn)的中立技術(shù),廠商對(duì)生態(tài)的控制其實(shí)非常有限,因?yàn)榇蠹也幌Mヂ?lián)網(wǎng)的入口被某一家商業(yè)公司所完全掌控,這是為什么當(dāng)年微軟選擇在操作系統(tǒng)捆綁 IE,也是為什么會(huì)被起訴壟斷。作為開(kāi)發(fā)者,(大多數(shù)情況下)不需要考慮用戶用什么瀏覽器,因?yàn)楦髌放频臑g覽器(通常情況下)遵循同樣的標(biāo)準(zhǔn)。過(guò)去十幾年不停有公司想基于瀏覽器做封閉的生態(tài)和標(biāo)準(zhǔn),比較成功的也就只有 UC 一家了,但是大家可以問(wèn)下作為 web 開(kāi)發(fā)者對(duì) UC 瀏覽器的平價(jià)是如何的 =。=...強(qiáng)化微信的「入口」能力才是小程序的野心。入口就是個(gè)門,既然是門就是雙向的——作為用戶,從什么途徑獲取到我需要的信息/服務(wù)(從哪扇門進(jìn)去?)?作為內(nèi)容/服務(wù)提供商,從什么途徑能夠接觸到我的目標(biāo)和潛在用戶(在哪扇門后等候或者直接出去?)?
目前從官方發(fā)布的信息來(lái)看,微信描繪的圖景對(duì)于用戶確實(shí)還是很美好的,裝了微信,掃下二維碼就可以方便的交水電費(fèi);而對(duì)于服務(wù)商,現(xiàn)在還看不到太多的好處,沒(méi)有高曝光的入口,不能推送等等,直接限制了服務(wù)商 touch 用戶的能力,但如果你天然是個(gè)自帶流量的大 V 服務(wù)商,小程序能提高現(xiàn)有流量在某些場(chǎng)景(現(xiàn)在看線下可能是主要)的轉(zhuǎn)化率,則是能馬上實(shí)現(xiàn)的,但想從微信的生態(tài)拿流量可能就沒(méi)那么簡(jiǎn)單,微信成貔貅把大 V 流量都轉(zhuǎn)化成自己的倒是很有可能。有微信全球 7 億月活的用戶(2015 年底數(shù)據(jù))資源,至于是不是基于所謂的 web 技術(shù)來(lái)實(shí)現(xiàn),who cares?
=========補(bǔ)充一下關(guān)于小程序最終使用 webview 渲染的事情。目前的小程序最終還是使用 webview 渲染,這是之前表述不嚴(yán)謹(jǐn)?shù)牡胤健6宜f(shuō)的 runtime 差異,是指開(kāi)發(fā)者的運(yùn)行環(huán)境依賴于什么。小程序的環(huán)境,就是開(kāi)發(fā)者所能接觸到的最底層環(huán)境,開(kāi)發(fā)者只依賴小程序給大家提供的環(huán)境。而這個(gè)環(huán)境再下層如何處理,并不受開(kāi)發(fā)者控制,也沒(méi)有任何辦法 access,這意味小程序的開(kāi)發(fā)并不依賴 webview,開(kāi)發(fā)的目標(biāo)平臺(tái)也不是 webview。
這樣實(shí)現(xiàn)的原因,可能有很多,比如綜合考量研發(fā)成本和收益、最大化利用現(xiàn)有技術(shù)等等。而可能性同樣很多,比如他可以隨時(shí)把渲染換成原生 UI,而不需要現(xiàn)有的接入商做任何調(diào)整。無(wú)論開(kāi)發(fā)體驗(yàn)多像瀏覽器,它都不是瀏覽器,即使它現(xiàn)在最終使用 webview 來(lái)渲染,開(kāi)發(fā)者同這個(gè) webview 中間還是有個(gè)中間件的,就像你不能說(shuō)我在一個(gè)跑在 Windows 上的瀏覽器里做 web 開(kāi)發(fā)就是在做 Windows 開(kāi)發(fā)一樣。它是微信自己規(guī)定的一個(gè)新環(huán)境,只能同微信允許訪問(wèn)的資源互動(dòng)。
二十幾年 web 開(kāi)發(fā)所積累的經(jīng)驗(yàn),能復(fù)用到其中的除了語(yǔ)言層面之外,并不多,當(dāng)然目前它的復(fù)雜度也不高。只要它定義好的 API、標(biāo)準(zhǔn)不變,作為 runtime 如何理解、執(zhí)行就同開(kāi)發(fā)者無(wú)關(guān),更重要的是我們無(wú)法控制。WXML 轉(zhuǎn)成 HTML 再給 webview 渲染,這是 runtime 的行為,對(duì)開(kāi)發(fā)者是透明的。
某個(gè)版本如果把 WXML 直接繪制成原生 UI 了,他不說(shuō)用戶和開(kāi)發(fā)者可能都是無(wú)法感知的事情。
Latest Signing
App Develop
Common Problems
Website Construction
Weixin Develop
Mobile Website
Website Optimization
Website Optimization
Website Design
Host/Domain