`
nkliuliu
  • 浏览: 210488 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

淘宝前端javascript类库选择原因

阅读更多

注:本文已发表于程序员杂志。下面的文字总体结构未变,细节稍有修改。)

书写干净漂亮的代码非常不易。作为前端工程师,还得处理恼人的浏览器兼容性问题。Protoype, jQuery, YUI, MooTools 等各种 JavaScript 类库,都是为了让前端工作更轻松自如。下面将介绍前端类库 KISSY 的起因、设计原则和核心功能,以及相关开发流程和社区建设。

起因

已经有了 jQuery, YUI 等优秀类库,为什么还要自主研发前端类库?这个问题和淘宝的发展历程息息相关。

2006年之前,淘宝最早期的时候,页面非常简单,视觉、交互和前端开发,基本上都能由一个人从头做到尾。这个时期,脚本用得不多也不复杂,用不用类库都无所谓。

2007年开始,随着淘宝业务的快速发展,页面的数量和复杂性迅速增加。淘宝UED开始有专职的前端工程师,但人数只有5人。面对繁重的业务需求, 寻求一个高效稳定的JavaScript类库显得非常重要。由于当时阿里和YAHOO的密切关系,淘宝很自然地选择了YUI类库。YUI为淘宝的前端发展 立下了汗马功劳。

很快,2007年下半年开始,淘宝的前端工程师发现,页面上的不少通用功能,都不能直接套用YUI的现有组件来完成。比如图片轮播、弹出层等,如果直接用 YUI的组件,会导致要加载的文件很大,修改成本还不低。于是淘宝开始基于YUI的核心功能,实现了一套常用组件,加上一些实用的辅助工具类,形成了淘宝 的第一代前端类库:TBra.

TBra 由 YUI Core 和 SimpleSlide 等实用组件组成。到 2008 年年初已趋于稳定。2008年是淘宝飞速发展的一年,前端开发工程师增加了近3倍,达到14人。

2008年到2009年,淘宝的业务更加迅猛增长。这两年里,jQuery风靡全球。jQuery简明易用的API风格,征服了大量Web开发者。 YUI2是个优秀的类库,但在全球对“Write less, do more”渴望中,YUI2的传统API风格越来越不受前端工程师待见。

2009年6月份,YUI团队发布了YUI3 beta版本。YUI3借鉴了jQuery的不少API设计,从整体架构到代码实现,与YUI2有很大不同。YUI3激荡人心,但试用下来却让人感觉沮 丧:虽然是颗粒化的可按需加载,但常用功能打包后依旧偏大;9月份发布正式版后,稳定性上也并不如意。期望后的失落,最是难受。

2009年年底,淘宝前端工程师翻了一倍,增加到30人。面对淘宝旺盛的业务需求,面对大量工程师对jQuery的认可,面对YUI2的落伍与缓慢更新,面对YUI3的诸多不如意,所有问题交织汇集在一起,淘宝前端面临着以下几条路:

  1. 继续使用YUI2, 完善TBra
  2. 全面升级到YUI3, 包括TBra
  3. 全面迁移到jQuery
  4. 混用YUI2, YUI3和jQuery
  5. 基于jQuery开发组件类库
  6. 自主开发全新类库

所有这些选择,在方向上,没有孰对孰错。jQuery非常适合中小型站点的快速开发,但对大型团队的合作来说,YUI内禀的代码组织方式更佳。 YUI3在当时还不够稳定成熟,API的设计上,对普通开发人员也不够友好易用。TBra的设计初衷是快速、简单、易用,但在代码组织和可扩展性上,已逐 步暴露出局限性。综合各种考虑,最后只剩下两条路:

  1. 基于jQuery 开发组件类库,典型代表:豆瓣的Do类库
  2. 自主开发全新类库,典型代表:淘宝的KISSY类库、百度的Qwrap类库、腾讯的Jet类库等等

方向对了,走什么路,关系并不大,最重要的是坚持往前走。 以上是淘宝选择自主研发前端类库KISSY的心路历程。

设计原则

爱因斯坦说:“让一切尽可能简单,但不要过于简单。”在设计领域,KISS代表简约原则:“Keep It Simple, Stupid”. KISSY的命名和设计原则皆源于此,诠释为一句话是:

小巧灵活、简洁实用,使用起来让人感觉愉悦。

小巧是相对小巧。 考虑国内的网络状况,还有不少用户在使用512K的宽带,以及BT软件、视频站点的流行,要让 用户快速打开页面,在国内并不是一件容易的事。对于前端类库来说,小巧的体积非常有必要。jQuery的体积可以接受,YUI3在这一点上则处于劣势。 KISSY会在功能和体积上权衡,尽量小巧。

灵活是适度灵活。 设计领域有个值得推崇的原则:针对场景进行设计。KISSY核心功能的取舍,KISSY组件的特性选择,所有一切,都会尽量从实际需求出发,在总结归纳的通用使用场景下进行设计。适度灵活需要我们懂得舍弃,在精简小巧和可扩展性上不断权衡。

简洁实用是基本要求。 放在设计原则里,是为了能时刻提醒类库开发者保持落地。一个类库,并非功能越强大越好。完美的诠释有多种。对于KISSY来说,保持API的简单易用,保持功能的精简实用,不求全但求精,力求用短小的代码完成常用的80%的功能,这就是KISSY追求的一种完美。

使用起来让人感觉愉悦,这是更高层次的追求。 我们期望在使用KISSY时,你不会感觉枯燥乏味,甚至不会觉得这是工作,而会感觉是在和一位老朋友愉悦交流。在你想用到某个功能时,你的直觉就能指引你应该调用哪个API,而无需过多地去查阅文档。

除了想给类库使用者带去愉悦体验,我们还希望基于KISSY搭建的网站,网站的用户能获得非常好的浏览体验和使用体验。KISSY的不少组件,内置 了对可用性的考虑,简单如标签页切换的延迟,复杂如富文本编辑器的交互体验,所有这一些,默认就尽量去让用户能更好的使用。我们相信,这很有价值。

核心功能

KISSY从设计之初,就尝试从各个类库中存精去芜,核心功能包括:

种子(Seed)是使用KISSY的入口。通过种子文件,你可以自由灵活地加载所需要的组件。比如要在页面中使用日历,仅需如下书写代码:

<div id=”cal”></div>
<script src=”path/to/kissy/seed-min.js”></script>
<script>
KISSY.use(‘calendar’, function(S) {
    var cal = new S.Calendar(‘#cal’);
    // more code
});
</script>

seed-min.js 就是KISSY的种子文件,gzip后大小不到5KB. 页面中仅需引入它,就可以自由加载KISSY的任何组件。

核心(Core)包括dom, event, ajax, anim, node, data等一系列常用功能。这些功能绝大部分是各大前端类库的标配。KISSY借鉴了jQuery简明易用的API设计风格,同时采纳了YUI3的颗粒化代码组织方式。一段典型代码如下:

<script>
KISSY.use(‘core’, function(S) {
    S.one(‘#id’).on(‘click’, function(ev) {
        ev.preventDefault();
        this.addClass(‘active’);
});
});
</script>

种子和核心是构建各种组件的基石,详细功能请参考KISSY的文档

组件(Components)包括工具类组件(Utilities)和可视化组件(Widgets),是KISSY最重要的组成部分。组件的公共接口和配置,都尽量保持了内在的一致性。能让你在学会使用KISSY的一个组件后,能马上推测出其它组件的使用方式。

KISSY的组件严格遵守适度灵活原则,在特定的场景下进行设计。任何抽象场景,都有不同的抽象层次。比如淘宝首页的图片轮播,至少有以下三种层次的抽象:

  1. 图片轮播是可轮播的多张图片
  2. 图片轮播是可切换的一组内容
  3. 图片轮播是对命令的响应

第一种抽象,会让我们做出像TBra里的SimpleSide类似的组件,功能很纯粹单一。大部分站点用jQuery等代码实现的图片轮播,也是基于这种简单明了的抽象。

第二种抽象,会让我们思考更多。比如图片轮播和标签页切换的关系,从这一层的抽象来讲,标签页和轮播图片本质上一样的,都是一组可切换的内容。在这 一层抽象上,我们就可以实现Switchable(可切换)组件,有了Switchable,所有可以抽象为可切换内容的可视化组件,就都可以快速基于 Switchable来实现,而不是全新写一个。在淘宝首页上,大部分可视化组件都是Switchable组件,非常便捷。

第三层抽象,很抽象,但抽象层次越高,落地越难。基本所有交互组件,都可以抽象成为对用户行为的响应。适度灵活原则,能避免我们掉入过度抽象的陷阱。

除了Switchable等常用组件,KISSY里还专门为部分复杂组件打造了子品牌专区,目前有KISSY DPL(设计模式库)、KISSY Editor(富文本编辑器)、KISSY AJBridge(Flash相关功能)、NodeJS-KISSY(让KISSY运行在NodeJS上)等。详细内容,请关注我们的文档和社区。

开发流程

一个类库要持续发展,需要一套行之有效的流程来保障。KISSY的开发流程可以总结为下图:

KISSY组件的开发非常重视预研阶段。我们建议每一个开发成员,至少花一半时间在组件的预研上。预研可以保证针对场景进行设计,可以让最后产出的公共API能被大家一致认可,能符合KISSY设计的整体要求。

在开发阶段,我们推荐BDD(行为驱动开发)。良好的BDD习惯,和代码评审机制,能让我们的代码可靠,团队成员也能在过程中得到技能成长。

单元测试框架目前KISSY选择的是Jasmine, 目前还处于摸索起步阶段。但有热情和信心,就不怕远。

社区建设

KISSY是完全开源的,目前放在github平台上管理。相关社区信息如下:

KISSY已正式发布1.1.5版,下一个版本是1.2, 将于今年12月份正式发布,敬请期待。欢迎各位朋友的试用与建议。

分享到:
评论

相关推荐

    淘宝前端架构

    #### 四、JavaScript类库的选择 在众多JavaScript类库中,YUI是一个被广泛使用的选项。YUI分为两个版本:YUI2和YUI3。YUI2更加符合Java程序员的思维模式,而YUI3则更具吸引力。然而,YUI也存在一些缺点,比如体积较...

    王保平:新时代的前端代码组织与类库构建方式

    KISSY是一个轻量级的JavaScript框架,由淘宝前端团队开发,目的是提供一个简单易用,高性能且适应各种场景的前端框架。SeaJS则是一个模块加载器,它可以帮助开发者更好地组织和管理代码依赖,使用模块化的方式开发...

    JavaScript权威指南(原书第6版)1

    《JavaScript权威指南(原书第6版)》是JavaScript开发者不可或缺的参考资料,由著名作者David Flanagan撰写,淘宝前端团队翻译。这本书详细介绍了JavaScript语言的核心概念以及在Web浏览器中的实现,适合已有编程...

    JavaScript权威指南(第6版) 中文版

    作者:(美国)弗兰纳根(David Flanagan) 译者:淘宝前端团队 目录 前言 1 第1章 javascript概述 5 1.1 javascript语言核心 8 1.2 客户端javascript 12 第一部分 javascript 语言核心 第2章 词法结构 25 2.1 字符集 ...

    多用户商城 (仿淘宝版)_dotnet电子商务系统源代码.rar

    8. **前端界面设计**:UI设计需类似淘宝,提供良好的用户体验,包括商品展示、搜索、购物车、订单流程等,可能使用HTML、CSS和JavaScript,以及现代前端框架如React或Vue.js。 通过深入研究这个源代码,开发者不仅...

    基于PHP的启科PHP淘宝客系统源码.zip

    你还需要具备一定的前端技术,如HTML、CSS和JavaScript,以便修改页面样式和实现动态功能。此外,对MySQL数据库的操作和SQL查询语言的掌握也是必不可少的。 在安装和运行系统前,请确保你的服务器环境支持PHP运行,...

    基于PHP的卓敏php淘宝客站群系统源码.zip

    9. **前端技术**:HTML、CSS和JavaScript是构建网页的基础,了解这些能进行前端定制。 10. **安全性**:防止SQL注入、XSS攻击等网络安全问题,需要对PHP安全最佳实践有一定了解。 总的来说,"基于PHP的卓敏php淘宝...

    卓敏淘宝客站群系统.zip

    3. **前端资源**:HTML、CSS和JavaScript文件,构成网站的用户界面。 4. **后台管理**:用于管理站群内容、用户、推广链接等的后台管理系统。 5. **配置文件**:如config.php或web.config,存储系统设置和连接信息。...

    discuz集思街淘宝客模板.zip

    5. **前端技术**:运用HTML、CSS和JavaScript优化用户体验,如响应式设计以适应不同设备,使用jQuery或其他JS库进行动态交互。 6. **安全考虑**:确保代码的安全性,防止SQL注入、XSS攻击等,遵循最佳实践,如使用...

    淘宝上买的企业网站源码 前台加后台,代码完整,打开就可使用

    标题中的“淘宝上买的企业网站源码 前台加后台”表明这是一套完整的网站构建方案,包括了用户可以直接看到的前台界面以及用于管理网站内容和功能的后台管理系统。这意味着源码包含了前端和后端的全部代码,使得用户...

    PHP实例开发源码-精仿淘客泡泡淘宝客源码 php版.zip

    在实际项目中,文件名通常会包含更具体的信息,例如数据库配置文件、类库、样式表或JavaScript文件。如果这是源代码的一部分,可能需要解压后查看具体内容来确定其用途。 在PHP编程方面,该源码会涉及到以下知识点...

    基于PHP的淘宝导购网源码.zip

    此源码可能包含前端界面、后端逻辑处理、数据库连接、模板引擎、以及与淘宝API的对接模块等组成部分。 【标签】"PHP"进一步确认了该网站开发的核心技术是PHP,这可能是整个系统的服务器端脚本语言,负责处理用户...

    星星评分效果

    总结来说,星星评分效果的实现涉及到前端开发的多个方面,包括HTML结构、CSS样式、JavaScript交互以及可能的第三方库或SVG技术。开发者可以根据项目需求选择合适的方法,创造出美观且实用的评分系统。无论是一颗星为...

    手机淘宝系统

    "手机淘宝系统"是一个基于.NET框架开发的电子商务平台...综上所述,手机淘宝系统是一个涵盖了数据库设计、.NET开发、角色权限管理、前端交互、支付安全、物流管理等多个方面的复杂项目,需要多方面的技术和知识来实现。

    基于ASP.net的淘宝店主交易系统源码.zip

    基于ASP.NET的淘宝店主交易系统源码作为一个毕业设计项目,涵盖了Web开发的多个方面,包括前端界面设计、后端逻辑处理、数据库操作和用户体验优化,对于学习和掌握Web开发技术具有重要意义。 综上所述,这个压缩包...

    ASP淘宝网站形式设计与实现(LW+源代码).zip

    - `HelperScripts` 可能包含了辅助脚本,例如JavaScript或CSS,用于增强前端功能。 - `upimage` 指上传的图片,可能用于用户上传商品图片或其他需要图像的地方。 - `App_Code` 是ASP.NET中存放自定义类库和业务...

    C#+XML等模拟淘宝聚划算的Demo

    综上,"C#+XML等模拟淘宝聚划算的Demo"是一个综合性的学习资源,涵盖了C#编程、XML数据处理、MVC架构、jQuery前端操作等多个重要知识点,对于想要提升技能或了解实际项目开发流程的IT从业者极具价值。通过研究这个...

    基于PHP的Think-Think!淘宝多用户图片管理系统php版源码.zip

    此源码可能涉及的知识点涵盖了PHP基础语法、面向对象编程、数据库操作(如MySQL)、Web安全、前端开发(HTML、CSS、JavaScript)、MVC模式、ThinkPHP框架的使用、用户认证与授权、文件上传处理、图像处理以及API接口...

    基于PHP的淘宝全球购物网源码 php文章版.zip

    通常,一个完整的PHP项目会包含以下部分:前端HTML、CSS和JavaScript文件,后端PHP脚本,数据库配置文件,图片和其他媒体资源,以及可能的配置文件、类库、API接口文件等。 在源码分析中,我们可能会关注以下几个...

Global site tag (gtag.js) - Google Analytics