Tangram是百度内部一直在开发和使用的前端库之一,功能与jQuery、Prototype等库类似,主要功能是简化DOM操作,并且扩展JavaScript语言。这部分功能准确来说属于TangramCore,另外一个叫做TangramComponent的库提供一些类似YUI、Sencha这个级别的组件。
之前Tangram说要开源很久了,一直卡在流程上,并且也有人觉得必须把库做得足够好了才好意思拿出来开源。我个人的看法是,跟JohnResig的一样,前端库应该从第一天开始就开源,因为就算你不开源别人也一样能看到,所以还不如开放出来接受别人的贡献。如果你写得不好,就算你不开源,别人要看也还是能看得到的,所以还是直接把代码晒出来好了,看得不顺眼的可以直接说,实在看不下去了可以动手改,改完了再把代码贡献回来。
说完了我对开源的看法,接下来我们看看Tangram和Git分别有什么好,先从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代码。
为什么选择开源到Github?Git到底有什么好处?我觉得一个简单的例子就能很好地说明问题。
例如说,你想看看Tangram的源代码,那么你可以直接打开TangramGithub的首页,然后以只读的方式把代码都复制到本地。
gitclonehttps://github.com/BaiduFE/Tangram-base.git
读着读着,你觉得Tangram写得也不是那么好,想改改看。于是你回到刚才那个页面上,点Fork按钮,然后就相当于把BaiduFE下面的Tangram项目整个复制到你个人帐号下了。你当然拥有你个人帐号下Tangram项目的完全读写权限啦,这时候你就可以把它复制到本地了。
[email protected]: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这本书,作者把这本书放到网上并且免费公开了。