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