jQuery 为什么优秀兼谈库与框架的设计[转]

文章转自:https://github.com/lifesinger/blog/issues/114

从 @wintercn 的这篇文章说起:从 jQuery 谈库与框架的设计之优劣

先去读一读哦,不长的,winter 写得很幽默。

好了,看下文。

解决什么问题

拿 winter 的代码入手:

function traversal(node, f) {
    f(node);
    if(node.children.length) {
        for(var i = 0; i<node.children.length;i++)
            traversal(node.children[i],f);
    }
}

traversal(document.body,function(element){
    if(element.tagName=="button" && element.className.match(/continue/)) {
        element.innerHTML = "Next Step...";
    }
})

这段代码很酷,看见了递归没?还有传说中的函数式编程!也不长,只有 166 个字符。考虑 jQuery 那庞大的 97K 代码,完全可以自己写啊,真心用不着什么类库。

可是,各位看官,在中国,有两种东西需要小心:一是 CCAV 的新闻,二是程序员的代码。你信前者就幸福了,后者嘛,请看:

尼玛,winter 坑我,复制过来的 traversal 方法工作有点不正常呀

为了节约笔墨(精彩在后面),先不说 children 的坑(不说是因为 winter 刚好绕过去了),来说说下面这个:

<button class="continued">

这可不是故意挑刺,我们在讨论类库哦。上面的 button 也会被 traversal 命中。好吧,我帮 winter 修改下:

traversal(document.body,function(element){
    if(element.tagName=="button" && element.className.match(/(?:^|\s)continue(?:\s|$)/)) {
        element.innerHTML = "Next Step...";
    }
})

修改后,正则看起来很酷。师兄下次 review 代码时,应该会觉得我技术有进步,加薪、晋升有望了……

继续节约笔墨(精彩在后面),不说代码的优化空间。只想问呀,这么一个简单的功能,值得如此折腾吗?为何不用一行搞定:

$( "button.continue" ).html( "Next Step..." )

好了,各位看官,你还同意 winter 说的 jQuery 是 “没有问题创造问题也要解决问题” 吗?

调侃结束,言归正传。jQuery 解决什么问题,jQuery 能做什么,来看官网:

jQuery is a fast, small, and feature-rich JavaScript library. It makes things like HTML document traversal and manipulation, event handling, animation, and Ajax much simpler with an easy-to-use API that works across a multitude of browsers. With a combination of versatility and extensibility, jQuery has changed the way that millions of people write JavaScript.

云译一下:

jQuery …… 让 DOM 操作简单 …… 跨浏览器 ……

翻译有直译、意译、神译,但在云时代,得用云译。诠释如下:

  • jQuery 是 DOM 操作类库,非常专注。 这很重要很重要。正是这种 专注做小 的心态,让 jQuery 在 DOM 操作领域所向披靡。这比野心勃勃想着做大的 Prototype、YUI、Dojo 等不知强多少呢。jQuery 的流行证明了专注的力量。找老公也可以用 jQuery 去衡量。
  • jQuery 真的很专注。 常见的 each,尼玛的 Deferred 等看起来和 DOM 无关的东东,实际上跟 DOM 方法的实现很有关系,暴露出来挺有用,因此才暴露。此外,与 DOM 操作实现无关的 cookielocalStorage 等等,jQuery 一律不提供。(注:个人觉得如果这些内部方法不暴露,只暴露与 DOM 操作相关的方法,jQuery 会更完美。注2:别跟我较真说动画和 Ajax 不是 DOM 操作。)
  • jQuery 非常关注用户。专注于 DOM 操作及其兼容性,让普通用户包括设计师都可以快速写出代码,这是 jQuery 的巨大价值。

预测:苏宁电器会改名叫苏宁云商,但 jQuery 不会改名为 jLibrary。和 jQuery 同样专注的还有 Evernote、Amazon、Dropbox 等等牛逼的东东。

(精彩已讲完,下面可以不看。 在类库界,解决了 What,解决了定位问题后,基本上已经决定了生死存亡。 至于 How,也重要但往往不是关键。最近看 Grunt 类库,也有同感。)

也谈命名

命名非常重要。比如决定 winter 牛逼的,不是 1024,而是 winter 这个名字。

不过没看懂 winter 说什么,因为 winter 说的和 jQuery 没什么关系。可能跟 jQuery 的早期版本有关系,但任何事物都会有历史局限性,就如我就一直期待传送门,但不能嘲讽当代的汽车。

至于 $ 的选择,这就如 码农屌丝 等词汇一样,winter 好像也经常用,并不反感。$ 的选择也像 QWERT 键盘,或者系统中用 ~ 表示 Home 目录一样。为什么很少见 *nix 用户不爽 ~ 呢?

不评论了。要谈命名,不如谈 jQuery 的方法名,简洁明了。YUI3 等类库抄得不亦乐乎,这是一种认可与致敬。

接口设计

泛义上讲,完全同意 winter 的说法。我也非常讨厌一个方法职责不清、身兼数职。比如 RequireJS 里,最让我不能忍受的重要原因之一就是,天杀的 require 方法一会是全局方法,一会是函数变量,一会是云,一会是风……

不过, 谈任何设计,都离不开场景。

jQuery 是 DOM 操作类库。jQuery 首要要解决的是: 如何高效方便地操作 DOM? 在这个真实需求下,jQuery 选择了一句话:

找到 DOM 元素,然后再操作、继续操作。

上面这句话,不是 jQuery 凭空设计出来的,而是千万前端工程师们在写代码时实际上会干的事情:

var foo = document.getElementById("foo");

foo.setAttribute("data-bar", "bar");
foo.innerHTML = "...";

上面的代码挺不错的,但有坑。jQuery 将上面这种常见代码,通过链式操作简化成了:

$("#foo").attr("data-bar", "bar").html("...");

这就如我们一般不会说:

我是 winter
我喜欢编码
我喜欢妹子

而会说:

我是 winter,喜欢编码,也喜欢妹子。

至于 getter 和 setter 的统一,可以类比:

var host = { a: "a" };

// 获取值
alert(host.a);

// 设置值
host.a = "aa";

别跟我说一定要:

var host = {
  a: "a",
  getA: function() { return this.a; },
  setA: function(val) { this.a = val; }
}

不直接通过属性,而通过方法来搞定 getter 和 setter,个中缘由 winter 比我更清楚,有兴趣的可以看:defineProperty

其实上面说的跟 winter 反驳的没什么关系,winter 主要反对职责不单一。不过,职责不单一的方法,在 jQuery 里有,但并不多。至于 $ 的功能,这是入口方法,为了用户的便利性, 适当放下程序员的完美情节,个人觉得是一种 面向用户的权衡。很多产品也如此,在屌丝用户看来很糟糕,但普通用户还真喜欢,因为方便。

耦合

举例子来说说:

  1. YUI3 最初的理念中,有一个很重要的是 颗粒化。颗粒化使得 winter 可以单独调用 ajax 模块。然而,YUI3 发展至今,虽然颗粒化极细,但你若去看使用 YUI3 的页面,稍稍 YUI().use("node") 一下,加载过来的文件大小就超过 jQuery 了。
  2. 颗粒化必须考虑颗粒的大小、范畴。 在 DOM 操作领域,能够保持功能与 jQuery 近似,大小又比 jQuery 小的,目前我好像还从来没有看到过。除非把定位缩小,比如只支持 webkit,砍功能后,才有可能比 jQuery 更小。同等功能下,能做到 jQuery 这么优秀的 DOM 操作类库,如果你发现了一定要告诉我。
  3. 一个文件。 能用一个文件解决的,不用两个文件来做。超过一个文件就意味着依赖关系的管理。这里拿老赵的 Wind.js 来说,够屌丝了,但普通用户真不愿意去搞清楚那几个文件怎么引,还要分谁先谁后,天哪。所以后来 Wind.js 也有了 aio 版本(All in One)。方便用户,而不是满足自己。
  4. 历史与未来。 当然,上面说了这么多,但场景在飞速变化。比如 IE6 的市场份额在国外已经到了可以忽略的地步。场景的变化,使得 jQuery 开始朝向 2.0 发展。Animation 和 Ajax 等模块在设想中也都可以独立出来,还有很多很多变化。但最大的变化,个人觉得不是理念更先进了(模块化老掉牙了),而是 顺势而为。这个“势”是场景的变化。设计架构的演变,离不开场景。场景的变化经常推动着设计的进化。很多公司的架构之所以牛,并非牛人使然,而是公司业务场景的需要。快跑题了,这个另一个蛮有意思的话题……

写在最后

jQuery 的专注,不三心二意, 非常有利于生态圈的形成。君不见,jQuery 社区目前就是前端界的阿里巴巴呀,winter 你来一淘了,应该认可阿里的大方向哦。反观 YUI3 等框架,不是京东又是什么呢?

最后,来点煽情的。jQuery 在我心中,是一尊女神。她温柔、细腻,她火辣、傲娇,一定会有人骂她,但真了解她的,会爱上她。

原文地址:https://www.cnblogs.com/jun1019/p/12116968.html

时间: 2024-11-12 06:43:35

jQuery 为什么优秀兼谈库与框架的设计[转]的相关文章

从jQuery谈库与框架的设计之优劣

jQuery是业内知名的javascript框架,它的实现和设计可以说代表了javascript界最高的水平,本文试从四个方面来以jQuery为例总结库与框架设计的原则和优劣判断. 解决问题 首先请看一个我实现的框架,我把这个库称为四则运算. function add(a,b) { return a+b; } function mul(a,b) { return a*b; } function minus(a,b) { return a-b; } function div(a,b) { retu

完美解决jQuery符号$与其他javascript 库、框架冲突的问题

目前有大量的 javascript 开发框架,其中有一部分使用 $ 作为调用符号,这可能导致相互之间的冲突,而 jQuery 为解决这个问题,可以在 jQuery 导入时放弃 $ 使用权,届时 $ 则由其它框架使用,这样可以避免相同名字的函数调用不再冲突. jQuery 使用 noConflict 方法来放弃 $ 调用时的命名,之后由 jQuery 代替 $ 进行编写. 例如:alert($('#message').val()); 必须修改为 alert(jQuery('#message').v

jquery是库还是框架?

jQuery是库,不是框架. 库和框架区分很简单.库让你的工作更顺手:框架限制你的自由度,让你感到有些别扭,但让公司员工之间配合开发更顺手. 库只管引进来使用,除了库接口,没有其他约束,随便怎么用,free style:而框架则有着各种各样的严格约束. 例如bootstrap,约束了DOM结构. 例如AnglarJS,也对DOM结构有约束. 这些都是框架. 框架就像一门语言,有自己的世界. 用了什么框架,就得按照这个框架世界里的规则行事编码. "jQuery is a fast, small,

【JavaScript】对比12 款优秀的JavaScript MVC/MVVC框架 你最喜欢Backbone or Ember

http://codebrief.com/2012/01/the-top-10-javascript-mvc-frameworks-reviewed/ 目前基本所以后台程序都是面向对象MVC模式开发,作为Web前端开发的人来说,也是很需要的,那么目前有没有可以借鉴的呢?作者(Gordon L.Hempton)一直在寻求哪种MVC框架最为完美,他将目前能获取到的所有框架都粗略地试了试,然后在文章中列出了每一种框架的情况概要,在文末分享了作者经过对比之后最终的推荐产品. 首先要特别说明一下,作者认为

成为专业程序员路上用到的各种优秀资料、神器及框架

最近想着怎么把自己的知识体系进行整理起来,使用思维导图进行描述,对自己以后的发展也有一个更深的认识,更快的提升自己:看到了下面这篇文章,感觉非常实用,从语言到框架都非常全面,自己也可以继续补充,也是对自己知识体系的一个补充吧. 前言 成为一名专业程序员的道路上,需要坚持练习.学习与积累,技术方面既要有一定的广度,更要有自己的深度. 笔者作为一位tool mad,将工作以来用到的各种优秀资料.神器及框架整理在此,毕竟好记性不如烂键盘,此项目可以作为自己的不时之需. 本人喜欢折腾,记录的东西也比较杂

【真正福利】成为专业程序员路上用到的各种优秀资料、神器及框架

转载,原地址:http://www.cnblogs.com/jasondan/p/6380597.html 据说看到好文章不推荐的人,服务器容易宕机!本文版权归翟士丹(Stan Zhai)和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利. 好东西不是随便收集下,发篇博文,骗些点赞的!积累了5年多的东西,是时候放出来跟大家见见面了. 或许有的园友在14年的时候收藏过我的一篇"工欲善其事.必先利其器"的博文,时隔3年,已经

[转载]程序员路上用到的各种优秀资料、神器及框架

好东西不是随便收集下,发篇博文,骗些点赞的!积累了5年多的东西,是时候放出来跟大家见见面了. 或许有的园友在14年的时候收藏过我的一篇"工欲善其事.必先利其器"的博文,时隔3年,已经做了N多更新,那篇文章也已被我删除,迁移至GitHub,重新进行管理. 这篇文章,大家可以推荐.收藏,让更多的人在园内看到,让福利普照. 因为这篇文章,我以后不会更新. 但项目依旧会更新,所以,更好的做法是,请到GitHub上Star:be-a-professional-programmer 前言 成为一名

如何匿名上网?-兼谈安全上网

身在中国大陆,可能大家比较关心的是科学上网:今天我谈的不是科学上网,而是匿名上网与安全上网. 什么叫匿名上网?在互联网上,匿名是互联网独特的一种特性.1993年<纽约客>杂志上彼得·斯坦纳的一幅漫画被网民们所信奉.这幅漫画的标题是“在网上,没有人知道你是一条狗”. 虽然在网络上匿名给予了人们更大的自由(阅读与发布信息的自由),但是其代价则是丧失了信息来源的确定性,而且也会引发许多不良的和违法的行为.例如网络色情.诽谤性的言论,欺诈行为,侵犯版权等等. 匿名上网的重要性大家访问网站,然后绝大多数

前端里的库和框架

库和框架是什么呢? 虽然有时候在一些语境中他们是可以互相替代的,但是我们还是要了解下他们的真正含义. 库:它是一系列对象,方法的代码,我们通过引入库,来实现代码的重用,代码的精简. 框架:它是一个系统中可以重用的一部分,它可能不仅仅包括一种代码和资源,它可能包括了子程序,库,胶水语言,图片等等一系列资源. 所以,相对来说,框架的内容更加丰富,在某些情景中,它可能包括了多个库,多种脚本语言,多个子程序,图片等等. 举个栗子~现在应用十份广泛的JQuery就是一个库.JQuery里面都是Javasc