Truly
写精彩代码 品暇逸人生

再次为AjaxPro提速
作者:Truly

对于使用Ajax技术的站点,或多或少都会遇到令人头痛的性能问题,即使是获奖的Ajax技术应用站点Pageflakes,性能也不尽人意。作为富客户端的架构,js文件成为了网站中重负,我们站点采用的Ajax框架是AjaxPro(Ajax框架目前数以百计,AjaxPro算是其中比较优秀的框架之一),使用AjaxPro的时候,首先要将包含Ajax方法的类注册的页面上,这样做的效果是很好的将面向对象的概念与js结合起来,但是很可惜,注册这个方法却会让你付出昂贵的代价。注册这个类的时候,它会向页面上注册几段脚本,首先的代价损失是整个注册过程,至少会耗掉你200ms以上,其次是这个方法作为.ashx文件在服务器端通过httpHandlers处理为一些js文件,这几个js文件也是相当庞大的,有3个文件是AjaxPro的核心部分,它们分别是:prototype.ashx,core.ashx 以及converter.ashx。下篇文章我会分别对其进行剖析,3个核心文件大约会占用21k以上,加上httpHandlers处理的时间,将成为页面性能杀手之一。

所以首先我们使用直接引用而不是注册避免了注册消耗的时间,然后我们将这几个核心方法整合为一个js文件,以避免httpHandlers对.ashx处理消耗的时间,同时单一js文件会获得比多个js文件更好的性能,最后我对这个js文件进行了一些压缩,去除多余的空格和注释,以及递进换行等控制符,最终获得了一个17k的js文件,大约减肥了20%,点击下载ajaxpro.rar。当然还可以通过混淆来进一步压缩这个js文件,不过相对风险会比较大,我暂时没有时间去做测试。

凡事皆有两面,这样做的后果是增加了维护难度,因为不能通过简单的注册语句来为页面注册了,所有AjaxPro要用到的类和js都要自己去处理。可以参见我以前的一篇随笔《关于AjaxPro的性能改进》,对于AjaxPro方法需要使用下面几行代码来获取正确的js注册

Type type = typeof(aaa);
string assemblyName = type.FullName + "," + type.Assembly.FullName.Substring(0, type.Assembly.FullName.IndexOf(","));
if (type.Assembly.FullName.StartsWith("App_Code."))
assemblyName = type.FullName + ",App_Code";
string link = "<script type=\"text/javascript\" src=\"/ajaxpro/" + assemblyName + ".ashx\"></script>";

事实上,这个.ashx对于发布站点的话,也基本是固定下来的,所以你尽可以使用一些方法将这样.ashx发布时就自动生成为js文件放置于程序文件夹中,还可以对其进行压缩,上面所有的工作都可以通过程序进行批量处理,以免去手动之苦。

通过以上操作我的页面从800ms下降到了400ms不到的时间,你是否心动了呢?

 

posted on 2006-12-11 20:40  Truly  阅读(1253)  评论(5编辑  收藏  举报