现在如果你问别人“最近两年在Web开发领域最火的技术是什么”,Ajax这个词应该能占据一席之地。确实,自从05年底被提出,Ajax技术就以难以想象的速度迅速红遍大江南北,受到无数Web开发人员的青睐和追捧。而各种平台下的Ajax框架更是如雨后春笋般向外冒,以至于连微软这样软件业的巨头也迫不及待推出自己的框架——ASP.NET Ajax,并将其作为标准组件集成于VS2008中,想藉此讨好那些已经一听见Ajax这个词就热血沸腾的Web开发人员们。
当然,有赞美就会有责骂,Ajax也不例外。在它蓬勃发展的过程中,也遭到了不少非议,很多人提出使用Ajax技术会导致系统性能下降甚至用户体验的破坏。并列出很多理由,藉此呼吁广大Web开发人员回归传统Web开发。
我算是比较早接触Ajax技术的,当时我还在进行PHP开发,听到Ajax技术这个新名词后就想弄明白是什么东西。当时资料比较少,没有现在这么多关于Ajax的书籍和框架,我手头只有一本《Ajax基础教程》,还好,Ajax技术本身不算复杂,所以我还是很快弄懂了它的基本原理,并且马上应用到一个当时正在做的PHP项目中,用来做无刷新登录和数据验证。像很多备受同步刷新限制之苦的Web开发人员一样,当时我对这种神奇的异步交互叹为观止,于是开始无休止的研究。但是研究来研究去,我总觉得Ajax不过就是那么个东西,没什么太复杂的,只不过编写JavaScript比较痛苦罢了。直到后来我看了《Ajax实战》这本书,思想才大为改观,我才明白,原来Ajax也可以有这么多模式性的东西和性能方面的考虑。Ajax发展到现在,已经开始趋于成熟,那种刀耕火种从“HttpXMLRequest”写起的开发人员已经不太多了,但是对它的争论却没有停止。在这里,我也想结合我的经验,对Ajax技术提出一些个人观点,有不当之处,欢迎指正。
1.为什么要使用Ajax
很多人看到这个问题可能会觉得我很白痴:这还用得着废话吗?当然是为了实现异步交互的Web富应用系统了。但是,这里我想说的不是技术层面的,而是思想层面的,也就是,我们使用Ajax的思想动机是什么?如果不弄明白这个问题,我们有可能会患上“Ajax狂热症”——在应用中狂用Ajax,从数据验证到登录,再到页面无刷新更新,弄的整个应用几乎一次都不用刷新就可以完成所有工作,最后他开发的系统中充满了无法维护的JS代码,并且搞的使用系统的用户莫名其妙、精神错乱,最后崩溃。这样的例子并不少见。发生这样的情况,根本原因就是开发人员没有弄清楚我们为什么要使用Ajax。
我个人的观点是:Ajax可以存在于应用中的理由只有一条,那就是使用户体验得到改善。换句通俗点的话,就是使用户在用这个系统时觉得更爽。我们可以想想,Ajax给我们带来了什么?首先是增加了开发难度和代码维护难度。如果谁说他用Ajax后开发变简单了,我只能说这人是神人。用过Ajax的人一定会感觉到,使用了这项技术后,系统开发难度和复杂度陡然增加,即使是使用框架。其次,Ajax使得系统消耗加大,客户端不用说了,本来的“瘦客户端”在使用了Ajax后“胖”了不少,跑起来体能消耗自然加大,而有时由于不当的使用(例如在数据验证中,在文本框的change事件中调用后台验证,这会导致每输入或删除一个字符都访问服务器,输入一条信息可能访问了几十次服务器),也增加了服务器的负担。那么,我们付出这么大代价究竟是为了什么?那就是为了让用户有更好的体验,如果我们增加了开发难度,加重了系统消耗,最后又破坏了用户体验,那么我们是何苦呢?所以,我希望每个使用Ajax的开发人员(特别是Ajax初学者和喜欢无处不用Ajax的狂热份子),在每次使用Ajax的时候,先问问自己:这里加入Ajax后用户用起来是更舒服了还是更难受了?如果是后者,请毫不犹豫打消在这里使用Ajax的念头。
2.是否需要使用Ajax
上文我曾说过,使用Ajax的唯一理由是用户体验得到改善,但这并不是说只要能改善用户体验就一定要用Ajax。有时我们还要考虑为此付出的代价。(当然,如果你说只要用户舒服,付出再大的代价也在所不惜,那么我只能说佩服你,也许你应该考虑转行做慈善)首先要考虑的就是我提到过的复杂度和性能两个问题。这两个问题和用户体验永远是矛盾的,用户体验越是好,开发难度就越高,而且系统开销也大,这是无法调和的矛盾,我们只能使用折中策略,根据具体的情况找到一个最佳契合点。
例如,如果客户给的Money较慷慨,而这个系统访问也不太频繁,而且使用自己的服务器,那么我们可以考虑把天平向用户体验一边倾斜。但如果遇到一个很小气的客户,而且系统对性能要求很高,那你使用Ajax的时候就要小心了,如果你使用了过多的Ajax技术,并向客户大谈这个系统用户体检多么的好,也许这个客户并不领你的情,可能还会责怪你系统运行太缓慢或延误了交付日期。
所以,一个系统中用不用Ajax、用多少Ajax,都没有一个统一的量度,需要你根据具体情况进行权衡。所以,在你准备开发一个含有Ajax的Web应用时,请仔细考虑这个系统在用户体验、性能和开发复杂度方面各占多少权重,然后找到一个最佳契合点。避免性能第一、坚决不用Ajax的“Ajax恐惧症”和Ajax无处不在的“Ajax狂热症”。
3.如何提高Ajax的使用水平
如果说前两点是使用Ajax应遵循的硬性规则,那么这里讲的就是如何更好的使用Ajax的软性条件了。
Ajax是个好东西,但也取决你怎么使用。如果你遵循了本文上述两点,我想在大面上就已经没问题了。但是还有很多值得思考的地方,例如你的Ajax应用是不是系统消耗最小?有没有更好的开发方式?能不能让我的JavaScript代码更好维护?以下给出的几个Tips,也许对你提高Ajax开发水平能有帮助。
- 请学好学精JavaScript,这是你使用Ajax的资本,如果想真正精通Ajax,并开发出优质的Ajax应用,这就需要你精通JavaScript。
- 请无论如何把DOM是什么搞清楚,要知其然、知其所以然。
- 尽量使用标准化布局,把结构和表现相分离,这样对你开发优质的Ajax应用以及降低开发难度有极大好处。
- 平时多思考一些Ajax的东西,提高自己的思想层面,而不是只会闷头写代码。
- 多读一些关于Ajax的好书,例如《Ajax实战》、《Ajax设计模式》等。
- 提高自己的后台开发能力,虽然Ajax主要在前台开发中使用,但是在一个系统中前后台是相辅相成的,提高后台开发水平对你的Ajax开发大有好处。
- 虽然JS很古怪,但是请尽量使用面向对象思想写JS代码。请认真对待JS代码,写之前也要经过仔细的设计,要向后台代码一样注重其可复用性、可扩展性和灵活性,代码规范也必不可少。
- 不要太依赖框架,特别是ASP.NET程序员,只靠拖动几个控件也许能开发出Ajax应用,但是绝对开发不出好的Ajax应用,手写JavaScript不可避免,当然ASP.NET Ajax框架客户端对JS的扩展使得你可以更方便的编写JS,也可以让你写JS时使用更多OO思想。
posted @ 2008-04-09 11:16
EricZhang(T2噬菌体) 阅读(2894)
评论(34) 编辑 收藏 网摘 所属分类:
心得体会
发表评论
http://www.cnblogs.com/Emoticons/qface/055243929.gif" alt="" />好!
建议发到首页,给AJAX浇点凉水。
http://www.cnblogs.com/Emoticons/qface/055243188.gif" alt="" />
如果AJAX是燃烧着的汽油,浇上水就爆炸,我好看热闹啊!
http://www.cnblogs.com/Emoticons/others/haha001.gif" alt="" />
如果Silverlight可以用了呢,还需要AJAX吗?
UI层面向最终用户,是否用Ajax?用多少?首先站在用户角度考虑,尽量改善用户体验,再站在自己的角度考虑,尽量降低开发维护成本。
PS:1楼最近真是无所不在。
#4楼[
楼主]2008-04-09 13:31 |
@byrybye
也不一定啊。如果Silverlight可以完全取代AJAX,微软也不必在VS2008中集成AJAX框架了。就像Adobe Flash RIA一直也没能取代AJAX……
不过可以遇见,在不远的将来,AJAX、Silverlight和Flash将在RIA应用领域展开一场恶战
个人认为现在很多应用了AJAX的网站,对访问者的机子的性能都欠缺考虑(不太清楚是不是浏览器的垃圾处理导致的内存泄漏),我家里的barton 2500++512M跑一些网站里很复杂的AJAX应用都很费劲,响应反倒慢了不少,加AJAX功能时还是要适度。
#7楼[
楼主]2008-04-09 14:09 |
--引用--------------------------------------------------
brightwang: 个人认为现在很多应用了AJAX的网站,对访问者的机子的性能都欠缺考虑(不太清楚是不是浏览器的垃圾处理导致的内存泄漏),我家里的barton 2500++512M跑一些网站里很复杂的AJAX应用都很费劲,响应反倒慢了不少,加AJAX功能时还是要适度。
--------------------------------------------------------
恩,我的第二点正是说的这个问题,有时开发者一味追求体验,忽视了性能。在开发Ajax应用时应该更好的权衡
楼主说的很好,只是对于:
====================
Ajax使得系统消耗加大
====================
这个要看着记者如何设计了,Ajax并不只应用于onchange的情况,我觉得更多时候他是帮助减小服务器负担的(单纯的AJAX层面,不是说ASP.NET AJAX)。比如使用JSON数据刷新列表、部分区域数据验证以及异步传输带来的客户端状态的保持问题等等。
@brightwang
是的,你说的情况我也确实碰到过,我用2G内存的机子还是有点卡,后来我看了下他们的源代码,发现好多人真的以为“异步”就完全等同于Ajax,Ajax就完全能够使客户体验的提高了——在页面使用了大量的模板(赞同,只是这些模板似乎也没做到位),接下去为每个区域的模板提供了N多个ashx的异步调用,而且调用回来的还是html,有的还有同步传回的二进制图片数据,这样的程序能不卡么?
@SZW
没错,所以我觉得如果一次返回的数据量太大的话还是别用AJAX了,还不如直接POST一次到服务器来的好。
另外没看过有人探讨过浏览器的垃圾收集和javascript对象的内存具体占用的讨论,希望能看到这样的文章,解决我的疑惑。
#10楼[
楼主]2008-04-09 14:59 |
@SZW
恩,SZW说的很对,有的时候,设计良好的Ajax确实能在一定程度上减小服务器的负担,不过我个人觉得,从总体上来说,系统负担还是大了点。因为我觉得几乎所有的应用在使用Ajax后,访问服务器的次数都变多了……
#11楼[
楼主]2008-04-09 15:02 |
@brightwang
恩,同意。像整页刷新这样的操作,我觉得还是直接用同步POST调用好一点,不然用AJAX调用,然后用个半透明的DIV遮住屏幕,再加个GIF动画,写着“请稍后……”,我觉得这样的AJAX就没什么意思了
@T2噬菌体
我觉得访问服务器次数的多少并不应该成为服务器负担的主要判断标准,实际上最简单的ajax的请求(如通过请求ashx甚至html的方式)很多时候哪怕你请求四五次可能也比不上一个不太合理布局的传统postback给服务器来带的负担及其客户端的延时。我举一个用户注册检验用户名是否存在的例子,你可以为了这个简单到不能再简单的功能去用普通的postback检查(注意这里说的是普通的postback,asp.net ajax用的也很多都是postback),但是你一遍遍的postback除了给用户制造麻烦——如果用户名始终存在的话——给服务器的负担可能要远远大于简单的ajax自动判断的负担。在这种请求数量相当的情况下,你会使用ajax还是传统postback呢?延伸一下,如果ajax请求再多一点,你难道会转向(传统)postback吗?
当然像你说的在onchange情况下每一次操作都要请求服务器的情况,确实应该以软件、硬件、客户体验做好充分准备的情况下面用,并且一旦做好准备,再讨论效率的损失就没有意义了,就像你说的都是有利有弊的,而对于没有做好准备而盲目使用的项目来说,那简直就是“饮鸩止渴”了。
辛辛苦苦整了n多ajax 设计用户体验
最后冒了一句很经典的话
“不就是套个UpdatePanel么”
这大概就是众多不大了解ajax的.net程序员现状
--引用--------------------------------------------------
Yannic Yang: 辛辛苦苦整了n多ajax 设计用户体验
最后冒了一句很经典的话
“不就是套个UpdatePanel么”
--------------------------------------------------------
坚决抵制还没有搞明白javascript就上框架胡搞的开发人员。
SZW最近不忙了啊,呵呵。我们是AJAX能不用就不用。
--引用--------------------------------------------------
Yannic Yang: 这大概就是众多不大了解ajax的.net程序员现状
--引用--------------------------------------------------
Yannic Yang: 辛辛苦苦整了n多ajax 设计用户体验
最后冒了一句很经典的话
“不就是套个UpdatePanel么”
--------------------------------------------------------
--------------------------------------------------------
哈哈,确实有这样的现象,
但你听到时,顿时无语~
我是JavaScript盲,一直想扫盲,还没功夫。观望中...谢谢lz中肯的建议
#19楼[
楼主]2008-04-09 17:34 |
@SZW
嗯,说的很好!学习了,我也得再好好想想这个问题……
若是Ajax带来了性能方面的降低,那么需要首先考虑的是程序的设计,而不是怪罪于Ajax本身。如果合理应用的话,Ajax能够在提高用户体验的同时提高程序的性能。
--引用--------------------------------------------------
T2噬菌体: @byrybye
也不一定啊。如果Silverlight可以完全取代AJAX,微软也不必在VS2008中集成AJAX框架了。就像Adobe Flash RIA一直也没能取代AJAX……
不过可以遇见,在不远的将来,AJAX、Silverlight和Flash将在RIA应用领域展开一场恶战
--------------------------------------------------------
Silverlight和Flash的“恶战”可能会发生,不过ajax不会参与其中,毕竟本质上不是一个东西。
补充楼上的,PPK也在他的书里对JS的面向对象表示质疑,而且他自己写了10年的JS很少用过面向对象特性。
不过我觉的PPK的观点仅供参考,我觉得用JS的构建实体类后,序列化成JSON在POST到后台还是挺方便的,面向对象也还是有他的用武之地,不过我觉的JS还是瘦些好。
AJAX的缺陷还是在于它对搜索引擎不友好,这个似乎是硬伤
http://www.cnblogs.com/Emoticons/QQ/laf.gif" alt="" />真打起来了。我真的不是无意的
http://www.cnblogs.com/Emoticons/msn/red_smile.gif" alt="" />
@Tristan(Guozhijian)
才来园子混,不懂规矩,你老多包涵哈。
http://www.cnblogs.com/Emoticons/msn/tongue_smile.gif" alt="" />
继续坚持尽可能在必要时才用ajax,
继续坚持手写原始xmlhttp,
继续对框架持观望态度。
虽然JS很古怪,但是请尽量使用面向对象思想写JS代码。
------------------------------------------------
不同意,这是一个误区。Functional Programming就应该用Functional Programming的思想。正如学英文的时候你用中文思考是学不成的
不知道各位在整个开发的时间里,有多少时间是在追逐微软提出的概念,真正开发的时间有多少?这种类似的新技术还会层出不穷.
前方的迷雾扰乱了我的视野.
#31楼[
楼主]2008-04-10 12:32 |
@Yok
恩,很多人已经对这个观点提出质疑了,我想我也应该再仔细思考一下这个问题,谢谢大家的意见
不乱跳出很多页面 有进度
这就是我理解的ajax比起传统web页的优点
感觉是让用户到了一个控制面板同时知道他在干什么 干了多少了
最初用ajax是因为分析访问情况老发现客户根着后弹出来的页面"跑了"或者不知道到了网站的哪个层次
ajax用得很少
语言没有什么好坏,技术本来就是一种工具,物尽其用,这才是重点。