百度Clouda的初步探索
最近一直比較關(guān)注百度Clouda,參加了數(shù)次百度Clouda團(tuán)隊舉辦的技術(shù)沙龍,也利用了一些時間讀了開發(fā)文檔,下面談?wù)勎覍@個框架的初步理解:
1.輕應(yīng)用和Clouda的區(qū)別和聯(lián)系:
“輕應(yīng)用”這個詞是百度提出的,但是輕應(yīng)用的概念并不新,是在原來HTML5 WebApp加入了即搜即用的特色,其他的特點與HTML5 WebApp是完全一樣的。
輕應(yīng)用 = HTML5 Web App + 即搜即用
百度世界大會上所講的:“移動搜索+輕應(yīng)用”是滿足海量中長尾需求的最佳模式,可以有效解決應(yīng)用開發(fā)和用戶需求的對接。 其實就是講即搜即用的特點。
一般意義上的HTML5應(yīng)用的特點:
不需要下載,直接可以使用
不需要安裝,即不占用手機存儲空間
多平臺兼容
目前百度輕應(yīng)用有三個途徑開發(fā),AppBuilder、SiteApp、Clouda。
AppBuilder是一個App模板,用戶只需要灌入內(nèi)容,生成的應(yīng)用基本沒有吸引力,意義不大,是為App開發(fā)小白準(zhǔn)備的。
SiteApp是為了讓傳統(tǒng)的PC網(wǎng)站轉(zhuǎn)化為應(yīng)用,本質(zhì)上也是一種自動化生成工具,可以快速的把大型網(wǎng)站轉(zhuǎn)為移動應(yīng)用,雖然相比AppBuilder要靈活方便,但是需求固定,只適用于少數(shù)場景。
Clouda才是百度為開發(fā)者提供的輕應(yīng)用開發(fā)框架,靈活有意義。
但經(jīng)過一段時間對百度輕應(yīng)用的跟蹤,我發(fā)現(xiàn)在百度手機客戶端中已經(jīng)開始推廣的輕應(yīng)用中還包含了第4類,也就是傳統(tǒng)的HTML5應(yīng)用,這些應(yīng)用并不是使用Clouda框架開發(fā),而是使用傳統(tǒng)Web App方式開發(fā),例如:今日頭條。對于HTML5應(yīng)用其實UC等廠家已經(jīng)做了一些嘗試,在手機UC客戶端可以看到首頁中可以添加網(wǎng)頁應(yīng)用,應(yīng)用的數(shù)量已經(jīng)很多,包括糗百、奇藝、貓撲、掃一掃等等。實際上這些應(yīng)用也完全可以進(jìn)入百度輕應(yīng)用的列表中,但是這種方式的輕應(yīng)用與Clouda輕應(yīng)用的差別就在于缺失了Clouda幾個重要的特色:隨動反饋和部分SEO能力。
一般的公司開發(fā)一款應(yīng)用需要兩類開發(fā)者,服務(wù)器開發(fā)和客戶端開發(fā),這兩者的技術(shù)差異很大,即使是服務(wù)器使用Java,客戶端用Android,除了基本語言是Java外沒有其他的聯(lián)系,而且服務(wù)器和客戶端交互的時候,仍然需要將Java對象序列化為json數(shù)據(jù),客戶端接收到在進(jìn)行反序列化。服務(wù)器使用什么語言對于客戶端來說都一樣,都需要再寫解析程序。對于我們來說,之前我們采用服務(wù)器端通過反射機制自動生成接口代碼的方式節(jié)省客戶端的工作,也節(jié)省了修改接口文檔的工作。但是Clouda開發(fā)方式更加徹底,完全不需要糾結(jié)于此,徹底的打通了服務(wù)器和客戶端,不需要再書寫接口文檔,不需要生成接口代碼,服務(wù)器和客戶端代碼本身就在一起編寫,這也就是百度所說的云端統(tǒng)一,實際就是服務(wù)器和客戶端統(tǒng)一,好像現(xiàn)在大家都喜歡把服務(wù)器稱為“云”,可能聽起來更拉風(fēng)吧。
百度對Clouda的開放態(tài)度
從Clouda的github項目sumeru所采用的協(xié)議MIT來說,在這個協(xié)議控制下的開源程序基本沒有法律風(fēng)險,使用者可以修改、再發(fā)布、商業(yè)化等等都不需要知會百度,這個角度來說對個人還是公司都沒有風(fēng)險。但有的公司發(fā)布的開源項目在開源一段時間后同步發(fā)布商業(yè)版本,公司不再對開源版本進(jìn)行更新,完全交給社區(qū),僅更新商業(yè)版本,這回導(dǎo)致開源項目受到極大的影響,目前來看,百度有著更大的抱負(fù),沒有理由為從Clouda項目拿少量收入而使自身名譽受損,而且如果Clouda模式成功,這種做法也會推動社區(qū)開源版本的去百度化,嚴(yán)重影響百度的戰(zhàn)略布局。所以綜合兩種情況來看使用Clouda都是安全的。
初步使用感受
Clouda框架實現(xiàn)了MVC架構(gòu),應(yīng)用代碼結(jié)構(gòu)清晰條理,作為最重要的樞紐,Controller,三個主要時態(tài)分工明確,onload()函數(shù)中用來執(zhí)行數(shù)據(jù)的訂閱,是MVC中Controller和Model建立聯(lián)系的過程;這個函數(shù)中的代碼如果開啟了Server渲染,則很可能會在Server端執(zhí)行,這也就是為什么Clouda框架開發(fā)的應(yīng)用冷啟動速度優(yōu)于一般的HTML5應(yīng)用,因為在onload()函數(shù)中,服務(wù)器執(zhí)行了部分js代碼,使得客戶端節(jié)省了這部分代碼在服務(wù)器上執(zhí)行的時間。
onrender()函數(shù)負(fù)責(zé)對View的渲染和轉(zhuǎn)場,是MVC中Controller和View建立聯(lián)系的過程;
onready()函數(shù)負(fù)責(zé)在View渲染完成后,完成事件的綁定、DOM操作等業(yè)務(wù)邏輯,其中的代碼都是運行在客戶端的,所以可以使用前端js中的變量和函數(shù),比如window, document等。在百度技術(shù)交流會上童遙大牛也解釋過,他們正在做服務(wù)器端執(zhí)行剩下部分js代碼的工作,我的理解是dorender()代碼中的js部分,所以如果真的實現(xiàn)的話,應(yīng)用的冷啟動速度會進(jìn)一步提升。當(dāng)然這個技術(shù)是在用空間換時間,服務(wù)器執(zhí)行了js代碼,渲染了HTML,結(jié)果會一起發(fā)送給客戶端,相比原來的頁面,HTML內(nèi)容應(yīng)該更多。
下面是todolist例子中的代碼片段:
- App.todos = sumeru.controller.create(function(env, session){
- // 第一時態(tài):Controller需要使用的數(shù)據(jù)都在這個時態(tài)加載,訂閱發(fā)布數(shù)據(jù)
- env.onload = funtion(){
- return [getMsgs]; // 這里返回一個fuction
- };
- // 第一時態(tài)講解:如果您開啟了Server端渲染,那么在onload函數(shù)中需確保onload中,沒有使用前端的js中的變量或函數(shù),比如window,document,Localstorage等
- // 第二時態(tài):負(fù)責(zé)對View的渲染和轉(zhuǎn)場
- env.onrender = function(doRender){
- doRender('todos', ['push', 'left']);
- // 第一個參數(shù)定義了Controller和view視圖的綁定
- };
- // 第三時態(tài):在View渲染完成后,事件綁定、DOM操作等業(yè)務(wù)邏輯在此時態(tài)中完成
- // 每段邏輯使用session.event包裝,從而建立事件和視圖Block的對應(yīng)關(guān)系
- evn.onready = function(){
- };
為什么相比于普通的HTML5 Web App,Clouda框架開發(fā)的應(yīng)用可以實現(xiàn)即搜即用?
從上面的說明可以看出由于數(shù)據(jù)綁定在onload函數(shù)中運行,而Server渲染是默認(rèn)開啟的,也就是這段代碼是可以在Server端運行的,所以搜索引擎的網(wǎng)絡(luò)爬蟲是可以再次運行這段代碼,獲取到應(yīng)用內(nèi)的數(shù)據(jù),而傳統(tǒng)的數(shù)據(jù)只有在客戶端才可以訪問,如果搜索引擎要抓出應(yīng)用內(nèi)的數(shù)據(jù),那就意味著他必須重建環(huán)境,在服務(wù)器端運行客戶端程序,現(xiàn)在看來只有在搜索服務(wù)器上搭建移動端虛擬機,例如android虛擬機、iphone虛擬機,好像目前還沒聽到有公司使用這樣的方式抓取內(nèi)容。
Clouda框架中沒有UI部分
Clouda框架更偏向于數(shù)據(jù)層,沒有UI部分,用戶可以使用網(wǎng)絡(luò)上通用的UI框架,比如jQuery mobile, Kendo UI, Sencha touch等。
我認(rèn)為未來越來越多的創(chuàng)業(yè)團(tuán)隊會選擇Clouda進(jìn)行快速研發(fā),短期內(nèi)就可以得到產(chǎn)品驗證和反饋,大公司由于有歷史原因,原有的服務(wù)都是使用java或PHP編寫,數(shù)據(jù)庫是mysql或者mongodb,和Clouda對接有一定的難度,即使數(shù)據(jù)庫采用的是mongodb,原有的客戶端改寫了mongodb數(shù)據(jù),如果不進(jìn)行進(jìn)一步開發(fā),Clouda是無法感知數(shù)據(jù)庫中數(shù)據(jù)的變化,失去了實時性這個特色。另一方面,大公司在原有的平臺上已經(jīng)考慮了HTML5 Web應(yīng)用,從UC的網(wǎng)頁應(yīng)用數(shù)量可以看出,一般的HTML5 Web應(yīng)用開發(fā)方式和傳統(tǒng)的Android,ios,Winphone開發(fā)方式類似,web獨立代碼,作為第四個平臺,服務(wù)器端復(fù)用,使用ajax方式請求接口,可以滿足目前移動網(wǎng)頁端的布局。
傳統(tǒng)從來都會短期消失,習(xí)慣也不會一天改變,對于新興的優(yōu)秀技術(shù),只要先進(jìn),能加快研發(fā)進(jìn)度,實現(xiàn)效果,最終一定會成為一股潮流,至于是否能成功還有很多因素,希望百度能夠堅持下去,有大公司支持的開源項目生命力會更頑強,有百度的大力宣傳,才會有更多的開發(fā)者知道Clouda。
之后希望從更加技術(shù)的角度討論Clouda平臺開發(fā)。