Spiga

Tangram 前端库通过 Github 开源了

2010-12-24 16:20 by Cat Chen, 5094 visits, 收藏, 编辑

Tangram 是百度内部一直在开发和使用的前端库之一,功能与 jQuery 、 Prototype 等库类似,主要功能是简化 DOM 操作,并且扩展 JavaScript 语言。这部分功能准确来说属于 Tangram Core ,另外一个叫做 Tangram Component 的库提供一些类似 YUI 、 Sencha 这个级别的组件。

之前 Tangram 说要开源很久了,一直卡在流程上,并且也有人觉得必须把库做得足够好了才好意思拿出来开源。我个人的看法是,跟 John Resig 的一样,前端库应该从第一天开始就开源,因为就算你不开源别人也一样能看到,所以还不如开放出来接受别人的贡献。如果你写得不好,就算你不开源,别人要看也还是能看得到的,所以还是直接把代码晒出来好了,看得不顺眼的可以直接说,实在看不下去了可以动手改,改完了再把代码贡献回来。

说完了我对开源的看法,接下来我们看看 Tangram 和 Git 分别有什么好,先从 Tangram 说起。

Tangram 能做什么

熟悉我的人都知道,我从来不讨论哪个工具更好的,我只讨论在特定的情况下哪个工具更适用。因此,我们来看一下什么情况下 Tangram 是适用的。

Tangram 的总体设计很大程度上是参考了 Mootools 的做法,就是将框架拆散到函数的级别,你可以引用单个函数,而不一定要加载整个库。这样做的好处是节省带宽流量,尤其适用于那些流量很大但 AJAX 功能不多的网站。百度的很多服务流量都不小,而且常用页面上需要的 AJAX 功能也不多,因此 Tangram 成为了一个很好的解决方案。

那么什么情况下 Tangram 不适用呢?如果你要写一个 AJAX Web App , Tangram 就没有什么特别的优势了,除非你尤其熟练使用 Tangram 。一个 AJAX Web App 本身就依赖于库中大量分散的功能,把一个库拆分到函数级别并没有什么意义。当然,在 AJAX Web App 中, Tangram 也没有什么明显的劣势,跟 jQuery 、 Prototype 都差不多,这时候就由团队成员对不同库的使用熟练程度来决定选用哪个库了。

现在 Tangram 的最大弱势在于,它缺乏一种机制让你对页面逻辑的描述变得流畅( fluent ),而这正是我们使用 DSL 时所追求的。过去我也说过 jQuery 是一种 DSL ,它允许你用一种很流畅的语言来描述页面的交互行为,这使得页面交互行为变得很容易管理──读懂别人写的 jQuery 页面并不难,在上面做调整也很简单。这是 Tangram 为了减少下载体积做作出的牺牲,不过我希望它将来可以通过编译工具等方法来弥补这个缺陷──例如说,我还是用某一种 DSL 来描述页面交互,然后这种 DSL 能够被编译为 Tangram 代码。

Git 有什么好

为什么选择开源到 Github ? Git 到底有什么好处?我觉得一个简单的例子就能很好地说明问题。

例如说,你想看看 Tangram 的源代码,那么你可以直接打开 Tangram Github 的首页,然后以只读的方式把代码都复制到本地。

git clone https://github.com/BaiduFE/Tangram-base.git

读着读着,你觉得 Tangram 写得也不是那么好,想改改看。于是你回到刚才那个页面上,点 Fork 按钮,然后就相当于把 BaiduFE 下面的 Tangram 项目整个复制到你个人帐号下了。你当然拥有你个人帐号下 Tangram 项目的完全读写权限啦,这时候你就可以把它复制到本地了。

git clone git@github.com:CatChen/Tangram-base.git

可以看到,这是我的帐号( CatChen )下的 Tangram ,不再是 BaiduFE 下面的。这时候你就可以随意改动啦,改动完提交就是了。

git commit -a -m 'Tangram improvement'

如果你习惯使用 SVN 或者 CVS ,那么你需要注意啦, Git 的提交都是本地的,不会提交到服务器上去。你 Github 帐号下的 Tangram 是一个仓库,你本地编辑的则是另外一个仓库。别忘记了,你刚刚是用克隆命令把 Github 上的仓库复制下来的。所以在提交后,你还必须用推送命令把本地仓库复制回 Github 去。

git push origin master

在这里, origin 是一个远程仓库的别名。因为你本地的仓库是从 Github 上克隆下来的,所以 Github 上的仓库叫做 origin 。默认情况下,仓库只有一个分支,叫做 master ,所以你要把本地仓库推送到这个分支上去。

这时候,你自己的 Tangram 是更新了。如果你希望 Tangram 的官方版本也接受这个更新的话,你可以点击页面上的 Pull Request 按钮,这时候 Tangram 的管理员就可以考虑从你这里把更新拉取到官方版本上去。

如果你在开发自己版本的 Tangram 时,看到别人的 Fork 有更新了,并且也想要那个更新,怎么办呢?你可以主动地从别人那里拉取,然后 Git 就会帮你完成合并。例如说,我发现 Leeight 那里在做的一个 Tangram 升级不错,尽管他还没完成这个升级,也没提交到官方版本中去,但我就可以先把这部分升级拉取到我本地的仓库中来。

git pull https://github.com/leeight/Tangram-base.git

这样子,我就能看到 Leeight 所做的升级,跟我正在做的改动是否能够良好地兼容了。或者,我可以先做一些依赖于他的升级的事情,等他把升级做完了并且被官方版本采纳了,我再向官方版本提出 Pull Request 。

可以看到, Git 对开源项目来说是非常友善的,尤其是跟 SVN 和 CVS 做对比的话。 SVN 和 CVS 尽管允许分支,但分支之后通常要到项目完成时才会进行合并,这时候主干已经发生了很多变更,合并起来就相当痛苦。 Git 允许你分支后随时从别人的分支拉取变更,同时你还可以在自己的仓库内做很多子分支,这就使得开源项目管理变得十分方便了。

小结

说了那么多道理,建议大家还是动手实验一下比较好。试用 Tangram 无需下载,直接创建一个页面然后引用我们放在 CDN 上的脚本即可,然后可以尝试按照入门指南做些简单的东西试试。

使用 Git 管理开源项目的话,推荐阅读 Git 开发管理之道 ,能够让你更好地了解 Git 项目一般是如何进行分支的,以及如何利用这些分支获得更好的灵活性。如果你想看完整的 Git 手册,可以看看 Pro Git 这本书,作者把这本书放到网上并且免费公开了。

最后插播一下小广告,我的 jsHelpers 库也跟随着 Tangram 开源了,大家可以来 Fork ,我很欢迎大家提交 Pull Request 。

Add your comment

18 条回复

  1. #1楼 msnweb      2010-12-24 16:34
    git 没用过。

    git ,svn cvs的区别就是

    cvs 只有一个仓库,任何修改都必须锁住仓库,即使你还没改。

    svn 是你可以复制一个仓库, 任何修改都在你的本地,然后上传的时候,把你的仓库同步成 系统最新的那个,再合并 再上传。

    git 没用过了, 应该是你随时可以复制一个仓库,所有修改在本地,你的仓库可以随时同步成系统的某个版本, 合并在上传?

    如何合并 这始终是个大问题
     回复 引用 查看   
  2. #2楼 Tony Zhou      2010-12-24 17:25
    中文文档算是特色吧,没用过,不好说
     回复 引用 查看   
  3. #3楼 侯垒      2010-12-24 17:46
    请问一下,怎么安装git的服务器?
    git能不能获取svn的源码呢?
     回复 引用 查看   
  4. #4楼 痴情客      2010-12-24 17:48

    听过楼主的演讲,英文不错,思路也很清晰。
    很欣赏你。
     回复 引用 查看   
  5. #5楼[楼主] Cat Chen      2010-12-24 18:27
    @msnweb
    Git 类似你所说的,仓库之间同步,不过跟 SVN 的权限体系略有不同。这个差异就类似方法调用和事件派发的差异那样,主动和被动的区别。

    SVN 往往是管理员控制所有仓库之间的同步,管理员主动把一个分支合并到詅一个分支。 Git 是每个人控制自己的仓库,你能主动把别人的仓库内容拉取到自己这里来,但是你不能把自己的仓库推送给别人(除非那也是一个你控制仓库),你只能请求别人从你这里拉取。这个请求就像事件派发,你说你更新了,别人可以处理也可以丢弃。
     回复 引用 查看   
  6. #6楼[楼主] Cat Chen      2010-12-24 18:32
    @侯垒
    这个我也没有试过,开源项目一般直接放到 Github 就可以了,而且也免费。

    我搜索了一下,有一些文章介绍如何在 Linux 或者 Windows +Cygwin 上运行 Git Server 的,你可以看看。
     回复 引用 查看   
  7. #7楼 Ivony...      2010-12-24 20:20
    GIT理念很好,但是客户端(Windows)一直没找到特别好的,尝试过一段时间,但最终还是回到了Codeplex的SVN,因为发现不了解器内部运作的原理,用起来还是不很顺手,还是等研究透彻了再说。GIT对于松散的开发组织以及个人开发者是非常给力的。

    无论怎样,开源总是好事。
     回复 引用 查看   
  8. #8楼 longware      2010-12-24 21:27
    以前cvs,现在svn,git没玩过
     回复 引用 查看   
  9. #9楼 lexus      2010-12-25 00:48
    git commit -a -m
    这里的-a是什么意思呢
     回复 引用 查看   
  10. #10楼 Julin Rain      2010-12-25 03:51
    同事把下载地址发给我的时候,咋一看,还以为moo落户中文社区了呢,原来如此。读了一遍源代码,实话说,没有找到理由去支持。

    每个框架尽管都会越来越趋于平衡,但都会有各自的初衷。拿国外的来说:YUI在于扎实,prototype在于小巧,ext在于UI,jQ在于od操作,moo在于oo...与国内的比,query也许是因为司徒正美的对各个框架都了然,所以想要超越,淘宝的kissy也是为了更切合阿里系,更确切的说是为了淘宝商城使用,至少说明淘宝ued里面也有不白吃干饭的。那baidu这又是唱的哪一出呢?刚发布的一个满屏都是todo的框架就已经都1.3.3了啊?一天从早到晚在qq群里面打情骂俏嬉皮笑脸指手画脚传道授业的就是你们百度那帮闲得蛋疼的所谓“前台”。
     回复 引用 查看   
  11. #11楼[楼主] Cat Chen      2010-12-25 11:28
    @Ivony...
    是的,所以我推荐从 Git 开发管理之道这篇文章入手,先做一些简单的管理方案。具体怎么通过 Git 管理,我想还是要看看那些成功的项目是怎么管理的,才好说。
     回复 引用 查看   
  12. #12楼[楼主] Cat Chen      2010-12-25 11:31
    @lexus
    SVN 的提交是默认提交所有变更的; Git 的提交只包括你显式声明需要提交的变更。因此, Git 的提交应该是先 add 再 commit 的。 add 不是把文件添加到仓库,而是把变更添加到下一次提交。如果你需要像 SVN 那样,默认提交所有变更,就需要使用 commit -a 。
     回复 引用 查看   
  13. #13楼[楼主] Cat Chen      2010-12-25 11:37
    @Julin Rain
    Tangram 的目标是为了更好地服务于百度自己的产品线,开源当然是希望接收公司外的反馈啦。

    至于 todo ,这不是什么问题啊,一个库没必要做到非常好才开源啊,越早接收社区反馈,就能越早调整方向,或许调整方向后那些 todo 就不做了。
     回复 引用 查看   
  14. #14楼 airwolf2026      2010-12-26 17:07
    近来正想了解为啥大家都喜欢把项目托管到Git上呢.而不是原先的老牌的开源托管站点.这下总算找到点原因了...
     回复 引用 查看   
  15. #15楼 skyaspnet      2011-01-14 15:16
    请教一个事情,我记得有次好像看到百度的前端招聘页面,有黄方荣、您等高手的介绍,但是找不到那个页面了,好像是在hr.baidu.com上,能帮忙发个链接吗?谢谢!
     回复 引用 查看   
  16. #16楼[楼主] Cat Chen      2011-01-14 23:44
    @skyaspnet
    我不是很清楚,现在搜索也找不到,我只能帮你问问内部是不是发布过这样的页面了。
     回复 引用 查看   
  17. #17楼 banana.totolv      2011-05-05 20:03
    GOOD
     回复 引用 查看   
  18. #18楼 _@zhng      2012-01-14 11:38
    mark
     回复 引用 查看