作者:rssidea 来源:JavaEye 酷勤网收集 2008-06-10
jquery作为一款高质量的框架被大多web开发者所推崇。jquery也的确是一款伟大的产品,在实际开发中明显提高了效率。但是任何产品并不是完美的,或者说不总是完美的。本文旨在讨论不适合用jquery的情况,并非标新立异,请看我列举的情况:
javascript初学者
初学者很容易被jquery所提供的各种效果所吸引,平时焦头烂额都写不出的效果,被jquery几行代码轻松实现了。初学者如果在这个时候就用jquery来开发,打击自己的信心还算小事,更严重的是,jquery的理念"write less,do more"。但是,一个初学者如何能提高自己的水平?一个重要的方法就是多写吧!而这和jquery的理念是相矛盾的。更需要指出的是,jquery把javascript中比较重要的DOM和浏览器差异都解决了,使用者不需要为这些事情编写兼容性代码,这虽然提高了效率,但却不利于初学者培养扎实的javascript功底。
行为比较复杂的项目
比如网易邮箱,包含大量的ajax技术。虽然jquery在新的版本中号称具有800%的速度提升,但是那只是指DOM遍历的速度。而且,即使速度提高这么多,现在的jquery获取DOM节点的速度仍然比标准DOM方法(getElementById)高出4倍(这个是我自己测试的结果,大家可以自己试试)。当网站行为比较复杂的时候,这些微小的差距会累加,从而影响网站性能。
超高访问量的页面
当你的页面在考虑去掉缩进和多余空格来减小传输量的时候,你应该把jquery毫不犹豫地去掉。这将显著减小网站流量。
只需要jquery的一个功能
老实说,这并不是一个致命的错误,只能算一个不好的习惯。比如很多时候为了获得一个getElementById的简写,不惜引入庞大的jquery,这虽然算不上大问题,但有责任心的开发者不会做这种事情。
最后是我认为适合使用jquery的场合:中小型网站,专题,具有一定javascript经验的人。
fight_bird 的 评论:
不敢苟同:
1、初学者提高功底和是否学习、使用jquery没有必然相悖的因果关系,反过来体会到jquery的强大和便捷,更能领略包装、重构和创造性思维的价值,而陷入浏览器兼容性泥潭也根本无助于提高js功底。
2、你第二个论点我没看懂,不知道你要表达jquery的慢,还是快?DOM的快和复杂UI逻辑不适用有何关联?
3、一个ajax页面中缩进和空格占多大比例?很小!怎么可能显著减少网咯流量,相对ajax异步特性所减少的网络流量微不足道。
4、对于一个项目来说,若是一个jquery能解决web UI的全部应该是天大的喜事,至于“庞大的jquery”我不知道你指什么?组件库吗?只要使用ajax方式就少不了UI库,要知道jquery可最精简的主流ajax框架,和ext比起那是十分之一的概念,小一个数量级,何来庞大?
rssidea 评论2:
谢谢fight_bird的回复。
1,我是指初学者在开发中使用jquery,而不是指学习jquery。或者我的表述容易让人误会,我的意思是初学者应该尽量使用原生的javascript,这样提高对javascript的认识。如果你连document.getElementById、闭包、匿名函数都不知道,还谈什么“领略包装、重构和创造性思维的价值”?浏览器兼容性应该是学习javascript一个重要的挑战吧?
当然,你可以说.我使用jquery,但我还是可以学习啊?你要这么说那我也同意。不过请你想想,当你连一个菜单代码都看不懂的时候,去看jquery代码的恐惧。
2,当然是jquery慢,行为逻辑越复杂的页面对代码效率要求越高,jquery不一定适合。
3,请注意我的前提:“当你的页面在考虑去掉缩进和多余空格来减小传输量的时候”
另外,你可能也知道,jquery packed以后由94k变为29k,你能说去缩进,空格等没有意义吗?
4 你说一个项目,用jquery解决UI是天大的喜事,我同意。所以我才会说适合jquery中小型的网站。庞大是相对的,你硬是拿ext来比我也没办法。但是你有没有仅仅为了在一个页面里使用类似于$('#box').toggle()而引入jquery呢?(我是说某些独立的页面,不是网站)
wangdi 评论3:
呵呵,对第二点有点不同意见哈。。。
行为逻辑复杂的页面不一定对代码效率要求很高,反而对逻辑的执行方面要求较高,jquery的selector正是发挥长处的时候,,如果一个表单n多的输入框,进行某个操作后有若干的相关的输入框的操作,如果自己写js代码,呵呵,我相信能写好,但是这样的东西一多,自己js代码都看花眼了,更加不要说进一步开发调试了。。。
对代码效率要求高的页面当然最好是自己写,但是如果自己写的代价太大,也可以考虑牺牲一部分性能来换取开发速度和正确性。。。
xyz20003 评论4:
呵呵,感觉楼主有些炒作名词的嫌疑哟。标题虽是“不建议使用jquery的情况”,但细看内容,若把jquery改成prototypejs或者mootools似乎也都成立,这样这篇文章可以改做“不建议使用ajax组件库的情况”了。
以下是在下的几点拙见:
1.请不要说某某初学者在开发中学习ajax库,我希望公司项目中使用某某东东的时候,总会有一员大将可以掌控这门技术的,在开发中尝试新技术,即使是个老手也要担风险,更别说初学者了,让一个啥也不懂的去尝试新东西,这个公司的经理没有为公司负责。
如果是学习的话,您认为是借鉴性学习好呢?还是探索性学习好呢?前两年prototypejs刚出的时候,连文档都没有,几乎用ajax的老手都会建议新人去啃啃prototypejs代码,因为这样可以开辟js的新境界,怎么现在ajax库纷繁辈出,文档齐全反而不建议去学习了呢?
请恕我直言,天下文章一大抄,谁学习不是从看别人的代码开始的呢?你不让新手去抄jquery,他们就只好去抄以前那些老书上的代码,结果学了半个月学了alert(),document.write(),window.open(),代码毫无格式,写得乱七八糟,养成了坏习惯估计都改不过来了,到时候怕是咱们连哭都来不及。
2.jquery慢,prototypejs慢,mootools慢,但是那些代码都是经过优化的,(这里请恕我假设ajax库的里功能大家都能自己实现——不过在下水平有限,大部分都不会做。)你能保证仓促中写出的代码比经过多数人检验的代码更好,更快,更稳定吗?
打一个不恰当的比喻,谁都知道汇编比c快,c比java快,java比动态语言快,那怎么不见别人都用汇编呢?呵呵~咱们也不是说效率不是问题,但伟大的先辈说过“如果你不确定代码需要优化,那么千万不要试图去优化它。”这样来说,只有在确认ajax库成为瓶颈的时候,才应该去考虑它,而不是先假设它会拖慢整个项目。:)敏捷一些(希望不是贬义,有人对这意见比较大,可能会反过来说“你才敏捷呢,你全家都敏捷。”)。
3.服务端和客户端缓存是解决这个问题的主要途径,而不是删除某个文件。不过过多的js会占用带宽,够用就好,千万别贪多哟。具体问题具体分析。
4.请恕我臆断,一个简单到仅仅需要$()的项目究竟是个什么规模。看起来似乎连crud和高亮的功能都没有,听起来这这是一个静态页面,那么它的确没有使用ajax库的必要,因为他太简单了,简单到,即使加上了ajax库也不会有任何影响:),客户不会感觉到这个页面多了十几二十k,反而是使用了ajax库的开发者会如虎添翼,使用ajax库不但拥有的简练强健的功能,更多以后的功能扩展提供了便捷的途径,何乐而不为呢?
哦,如果我想得太复杂了,实际上页面就是太简单了,仅仅用到$(),好吧,可能美工就可以去做一个这样的页面了,连程序员都不用找,ajax还是省了吧。:)
PS:很可惜楼主没有指出jquery区别于其他ajax库的特点,我对jquery是浅尝辄止,因为它实在太好用啦,selector如此便捷,让我根本不用去想这个功能去js里应该怎么写,所有操作完全使用jquery提供的api就可以实现,甚至连el都封装好了,提供了各种常用函数,这让我觉得胆战心寒,害怕会因为这种便捷让自己完全依附到jquery上,怕我学会jquery的时候就不会用js了。想到这点我打了退堂鼓,从此以后再也没有使用过jquery。
不过在我接触了ext之后,这种疑虑被打消了,ext整个库400k+,比jquery大20多倍,封装的比jquery厉害没有20倍,估计也差不多,但随着学习的深入,不但没有扔掉以前学的js,反而更加强了,因为它给我提示了不同的应用可能,这种眼界的开阔可比你自己乱试要厉害很多,因为你是跟着这世界上最优秀的ajax库之一的作者在学习。
因此我的建议是,如果有可以节省我们时间精力的ajax库,那么最好第一时间去试一下,即使不实际使用,也不要放弃开阔眼界的机会哟。至于项目中是否使用,请根据各自情况选择:
1.团队中是否有人对此熟悉,至少做到80%问题可以立刻解决,10%的问题花点儿事件就能解决,10%的问题知道怎么迅速绕过去。
2.网路优化上我不擅长,实际情况实际分析吧。extjs太大了,好多地方都用不上,其他底层库那么小,估计不会有很大限制。当然还是有特殊情况,所以才要实际情况实际分析,咱们不把话说死好了。
rssidea 评论5:
回复:xyz20003
1,我说的不适合一开始就用jquery来开发,而不是分析jquery代码。当你能分析jquery,能看懂prototype的时候,已经不是初学者了。
2,时间仓促?那我支持你用jquery,他本来就是为快速开发来的。
3,具体问题具体分析,我同意。这一点大家评判时都忘了我的前提,让我很郁闷,我不打算再讨论这点。
4,我说的是一个页面,比如一个简单的专题页面,或者一个投票页面。还有我也指出了,这并不是错误,只是不好。
suxy 评论6:
1. 正因为jquery简单,才更能激发初学者对js的兴趣
3. 现在主流网站的首页都超过300k了吧,相对来说,jquery那点大小根本就不是问题,况且还有客户端缓存,并不是每次都要重新下载的。
liusong1111 评论7:
楼主没有突出说明jquery的问题,我理解的jquery的问题有:
1. selector很强大,但只能用于apply behavior,不能bind behavior,livequery是这个思路,却用的setTimeout,因为其异步性在程序流中会导致不可预期的行为。考虑性能的前提下,实现基于selector自动通配的bind behavior不是容易事。不知其它库(比如extjs)怎么做的。
2. jquery操作DOM太简单了,以致于很多plugin都滥用了这种手段,dom ready里动态修改元素DOM结构来追加一些特性(究其根本是依赖HTML的封装性、可扩展性不足以优雅的完成,所以才有xaml,xul,mxml这些东东),片面使用js实现扩展有可能导致客户端性能问题,结合服务器端技术可能缓解一下。 --举个例子,curvecorner这个plugin可以对匹配的元素前后左右包上N个1像素的div来实现圆角效果 - 这又是因为css的障碍,一个元素只能设置一个背景图,flexible的圆角,典型做法也需要多个元素分别设置不同的背景 - curecorner这个js可以在保证页面表达的简单性(一个元素,连图片都不用)的同时完成这个效果,问题是生成一堆元素对浏览器性能是个损耗,在客户端性能紧张的情况下,它可能只作为一种学术性的东西供人观赏了。
3. jquery现在发展的步子不像以前那么快了。
chenjinlai 评论8:
1.网易这种大项目做的人水平不会烂到基本的js都写不来
2.基本的js都写不来的人也不会想到用jquery,也用不了
3.需要处理超高访问量的网站...应该用zip压缩之类的技术减小带宽而不是去掉jquery吧...去掉效果怎么实现?用原生的js重写?业务逻辑复杂呢...再说了,jquery20k和一个图片差不多...与其计较这点带宽还不如花点钱多买带宽,而且带宽肯定是有余量的吧...
我觉得楼主说的情况比较罕见,不太可能会发生...
shawphy 评论9:
对于第一点:
完全初学者当然不可能用js,但是有一定程序基础,比如是本来做后台,现在转到前台来,有程序基础但对JS不熟悉,那用库是很方便上手的事情。另外,浏览器兼容性的解决绝对是有用的。你让个新手碰一鼻子灰还不如先提供好。并且如果好学,自然会去探究。不好学的,就算不让用jq也没用,成不了出色的JS程序员。
第二点,行为复杂的项目。是的,项目比较复杂确实JQ效率没原生的方法高,JQ的选择器是通过正则来实现的,效率当然相对底下。但是。仅仅是getElementById,当你要取10000个的时候,我这里才有2秒的差距。哪个项目会要你瞬间处理一个页面上10000个不同ID的元素?而且,如果真的需要,我们可以仅仅在这个地方使用getElementById代替,而其他地方继续使用jq所带来的优越性。想想他近乎完美的选择器我就不用多说了。另外,也可以通过一定方式优化文件结构来优化选择器效率。
第三点,不多说了,缓存呀。。。一张图片大小而已,30K的包,GZIP下多大?相对与庞大的页面,30K是否算大?而且一旦缓存,以后就不用再加载了。
第四点么,比较同意,当然,也是具体问题具体分析了。

