Tangram 前端庫通過 Github 開源了
Tangram是百度內部一直在開發和使用的前端庫之一,功能與jQuery、Prototype等庫類似,主要功能是簡化DOM操作,并且擴展JavaScript語言。這部分功能準確來說屬于TangramCore,另外一個叫做TangramComponent的庫提供一些類似YUI、Sencha這個級別的組件。
之前Tangram說要開源很久了,一直卡在流程上,并且也有人覺得必須把庫做得足夠好了才好意思拿出來開源。我個人的看法是,跟JohnResig的一樣,前端庫應該從第一天開始就開源,因為就算你不開源別人也一樣能看到,所以還不如開放出來接受別人的貢獻。如果你寫得不好,就算你不開源,別人要看也還是能看得到的,所以還是直接把代碼曬出來好了,看得不順眼的可以直接說,實在看不下去了可以動手改,改完了再把代碼貢獻回來。
說完了我對開源的看法,接下來我們看看Tangram和Git分別有什么好,先從Tangram說起。
Tangram能做什么
熟悉我的人都知道,我從來不討論哪個工具更好的,我只討論在特定的情況下哪個工具更適用。因此,我們來看一下什么情況下Tangram是適用的。
Tangram的總體設計很大程度上是參考了Mootools的做法,就是將框架拆散到函數的級別,你可以引用單個函數,而不一定要加載整個庫。這樣做的好處是節省帶寬流量,尤其適用于那些流量很大但AJAX功能不多的網站。百度的很多服務流量都不小,而且常用頁面上需要的AJAX功能也不多,因此Tangram成為了一個很好的解決方案。
那么什么情況下Tangram不適用呢?如果你要寫一個AJAXWebApp,Tangram就沒有什么特別的優勢了,除非你尤其熟練使用Tangram。一個AJAXWebApp本身就依賴于庫中大量分散的功能,把一個庫拆分到函數級別并沒有什么意義。當然,在AJAXWebApp中,Tangram也沒有什么明顯的劣勢,跟jQuery、Prototype都差不多,這時候就由團隊成員對不同庫的使用熟練程度來決定選用哪個庫了。
現在Tangram的最大弱勢在于,它缺乏一種機制讓你對頁面邏輯的描述變得流暢(fluent),而這正是我們使用DSL時所追求的。過去我也說過jQuery是一種DSL,它允許你用一種很流暢的語言來描述頁面的交互行為,這使得頁面交互行為變得很容易管理──讀懂別人寫的jQuery頁面并不難,在上面做調整也很簡單。這是Tangram為了減少下載體積做作出的犧牲,不過我希望它將來可以通過編譯工具等方法來彌補這個缺陷──例如說,我還是用某一種DSL來描述頁面交互,然后這種DSL能夠被編譯為Tangram代碼。
Git有什么好
為什么選擇開源到Github?Git到底有什么好處?我覺得一個簡單的例子就能很好地說明問題。
例如說,你想看看Tangram的源代碼,那么你可以直接打開TangramGithub的首頁,然后以只讀的方式把代碼都復制到本地。
gitclonehttps://github.com/BaiduFE/Tangram-base.git
讀著讀著,你覺得Tangram寫得也不是那么好,想改改看。于是你回到剛才那個頁面上,點Fork按鈕,然后就相當于把BaiduFE下面的Tangram項目整個復制到你個人帳號下了。你當然擁有你個人帳號下Tangram項目的完全讀寫權限啦,這時候你就可以把它復制到本地了。
gitclonegit@github.com:CatChen/Tangram-base.git
可以看到,這是我的帳號(CatChen)下的Tangram,不再是BaiduFE下面的。這時候你就可以隨意改動啦,改動完提交就是了。
gitcommit-a-m'Tangramimprovement'
如果你習慣使用SVN或者CVS,那么你需要注意啦,Git的提交都是本地的,不會提交到服務器上去。你Github帳號下的Tangram是一個倉庫,你本地編輯的則是另外一個倉庫。別忘記了,你剛剛是用克隆命令把Github上的倉庫復制下來的。所以在提交后,你還必須用推送命令把本地倉庫復制回Github去。
gitpushoriginmaster
在這里,origin是一個遠程倉庫的別名。因為你本地的倉庫是從Github上克隆下來的,所以Github上的倉庫叫做origin。默認情況下,倉庫只有一個分支,叫做master,所以你要把本地倉庫推送到這個分支上去。
這時候,你自己的Tangram是更新了。如果你希望Tangram的官方版本也接受這個更新的話,你可以點擊頁面上的PullRequest按鈕,這時候Tangram的管理員就可以考慮從你這里把更新拉取到官方版本上去。
如果你在開發自己版本的Tangram時,看到別人的Fork有更新了,并且也想要那個更新,怎么辦呢?你可以主動地從別人那里拉取,然后Git就會幫你完成合并。例如說,我發現Leeight那里在做的一個Tangram升級不錯,盡管他還沒完成這個升級,也沒提交到官方版本中去,但我就可以先把這部分升級拉取到我本地的倉庫中來。
gitpullhttps://github.com/leeight/Tangram-base.git
這樣子,我就能看到Leeight所做的升級,跟我正在做的改動是否能夠良好地兼容了。或者,我可以先做一些依賴于他的升級的事情,等他把升級做完了并且被官方版本采納了,我再向官方版本提出PullRequest。
可以看到,Git對開源項目來說是非常友善的,尤其是跟SVN和CVS做對比的話。SVN和CVS盡管允許分支,但分支之后通常要到項目完成時才會進行合并,這時候主干已經發生了很多變更,合并起來就相當痛苦。Git允許你分支后隨時從別人的分支拉取變更,同時你還可以在自己的倉庫內做很多子分支,這就使得開源項目管理變得十分方便了。
小結
說了那么多道理,建議大家還是動手實驗一下比較好。試用Tangram無需下載,直接創建一個頁面然后引用我們放在CDN上的腳本即可,然后可以嘗試按照入門指南做些簡單的東西試試。
使用Git管理開源項目的話,推薦閱讀Git開發管理之道,能夠讓你更好地了解Git項目一般是如何進行分支的,以及如何利用這些分支獲得更好的靈活性。如果你想看完整的Git手冊,可以看看ProGit這本書,作者把這本書放到網上并且免費公開了。