我对Ajax的一些看法

昨天跟秋实通电话的时候,他突然提起来了Ajax,无奈通话质量实在是糟糕(不知道是澳洲的电话网关糟糕,还是联通的通话质量糟糕),总之就是我听不清他说的话。因为这个话题技术性比较高,我实在是“猜”不出来他在说什么,只好自己瞎应和了几句便换了别的话题。
学Ajax也有一段日子了,也在Waki-Blog上进行了一些小小的应用,作为弥补昨天的“交流不足”,今天就来谈一下我对Ajax的一些看法。

Ajax,就是Asynchronous Javascript + XML(异步Javascript+XML)。Google是最早应用Ajax技术的公司之一,将Ajax推倒人们鼻子面前的就是Gmail和Google Maps。浏览时,不必刷新页面就能看到新的信息,这是一个多么新奇的体验啊。Yahoo邮箱和Live mail也开始了Ajax的尝试,并且提供了非常棒的用户体验。
我曾经是Ajax的反对者之一。虽然多次尝试过学习Ajax,但是一来缺乏用武之地(当时还没有Waki-Blog),二来我似乎对Javascript天生就缺乏好感,看到Javascript代码就头晕脑胀。后来在网上看到一篇文章叫《Ajax七宗罪》,列举了数条Ajax的缺点,引起了我的赞同,于是我便跨入了Ajax的反对者行列。现在想想,当时还真是有点吃不到葡萄说葡萄酸的味道。说Ajax没有缺点的是瞎子,但是只要运用得当,当然可以趋利避害,获得我们想要的结果。
那么,以下就简要谈谈我用Ajax这几个月来,对Ajax的一些看法。

1.降低服务器压力。这个是我开始学Ajax的最初动机,也是最主要的目的。我们可以通过将一些简单的操作交给客户端去完成,从而大幅度降低服务器开销。
因为写Waki-Blog写到了月份存档,如何做到这个月份存档可真是让我大伤脑筋,并不是如何做,而是如何以最小的服务器开销达到目的。要靠数据库查询来实现月份存档列表当然不困难,但是需要大量的数据库查询。除非你想把MySQL累死,否则这么多的数据库查询绝对是不允许的,所以存档列表当然要缓存。
怎么缓存呢,通过普通文本文件效率太低,通过生成PHP文件的方法虽然效率有所提高,但是前台后台代码复杂度势必大大提高。于是,这种时候我就想起了Ajax。首先,写新Blog的时候生成一个XML,客户端加载页面的时候读取XML,按照XML的内容生成存档列表。这样甚至不用“惊动”PHP和数据库,直接以普通静态文本的方式获得数据,大幅度降低了服务器的负担。
我写程序最注意的一点就是服务器负担,能少一次数据库查询绝对不多一次,尽管需要多写十几行甚至几十行的代码。某一次我看到某个Blog程序一个页面竟然用了18次数据库查询,真是把我吓了一跳。我还以为是我刚好赶上缓存过期、程序重建缓存就刷新了一次,没想到刷新之后还是18次……访问量上去了这么夸张的查询不把MySQL累趴下才怪。
2.实现数据与服务器之间的安全传输,提高密码验证的安全性。这个应用在以前的一篇《安全登录系统的设计与实现方案》已经比较详细地写过了,这里不再赘述。
3.与CSS搭配实现各种各样的特殊效果。比如Waki-Blog的淡入淡出“最近状态”、非刷新页面提交评论、新评论的颜色渐变、天气状况等等效果都是依靠Ajax才得以实现。
4.间接防止SPAM。如果通过Ajax提交表单,可以间接防止一部分机器人滥发广告(但是不能防止全部)。同样,如果通过Ajax来显示评论和TrackBack,搜索引擎就不会收录这些内容,因此再多的广告也是白发。同时,如果在显示评论和TB的同时,利用Javascript制作一些视觉上的特效,就可以同时达到防止SPAM和取悦客户的双重目的。

以上是我使用Ajax的一些心得。接下来谈谈我看到的Ajax的缺点:
1.受制于客户端。在不同的浏览器上的执行结果有可能不一样,一些较复杂的应用通常会为了实现同一个功能而为不同的浏览器编写不同的代码,对于一个程序员来说这是在是太令人反胃了。
2.不得不面对客户端与服务器端的通信延迟。因为Ajax包含了与服务器的异步通信,所以如果客户端与服务器之间的速度不好,那么用户将不得不为了一些内容而忍受长时间的等待(特别是在中国南北互访)。
3.搜索引擎不友好。因为搜索引擎并不会像浏览器一样实际去执行页面中的Javascript,所以通过Ajax所创建的内容都不会被搜索引擎收录。
4.浏览器的“后退”失效。浏览器的后退按钮不会记录Javascript对于DOM的操作,因此用户无法通过“后退”按钮来退回之前的内容。
5.增加服务器负担的潜在危险。Ajax不同于传统的同步模式,因为它加入了“异步”的元素。因此,客户端每次向服务器请求数据就会为服务器带来一次额外的请求,因此每个页面一次的请求如果到了Ajax这里就会变成两次甚至多次请求。

一个需要摆正的观念:什么时候需要使用Ajax?
只在必要的时候使用。引用《Foundations of Ajax》里的一句话“不要去做简历驱动的设计”,就是说,不要弄一个很花哨的东西来吹嘘自己是多么了不起,而要重视客户体验与运行成本。如果你处心积虑好不容易弄出来了一个庞大的设计,这个设计在开发人员的高性能电脑上运行良好,却在用户的普通PC机上慢如牛车,那这个设计可以直接丢到垃圾桶里去了。此外,如果用了Ajax的设计,却反而为服务器带来了更多的负担(提高了成本),那么这个设计同样是不值得采用的。比如,Google Suggest那样的输入提示不是每个网站都能做到的,只有像Google这种拥有天文数目的服务器资源,才能为用户提供如此高频率和准确的输入提示。准确估计自己的实力,才能用好Ajax。
同时,基于让搜索引擎收录更多的内容考虑,不要在重要的链接处使用Ajax。同时,在不希望被搜索引擎收录的内容上使用Ajax,降低这部分内容被搜索引擎收录的几率。

以上是我对Ajax的一些看法。不知不觉又堆了将近2500字……汗|||

《我对Ajax的一些看法》上有4条评论

  1. Pingback: Gracecode.com
  2. >>No.254 , sunplan
    呵呵,基本上,这个,很难被收录。如果是大量需要被搜索引擎索引的信息的话,就不要用ajax了。如果是跟用户交互密切的用户私人信息,可以考虑使用ajax来提高亲切度。

评论已关闭。