阿不

潜水

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

大家好像都有一种同感,使用了asp.net ajax的网站的速度好像都不是特别快。目前维护的网站,页面执行时间在0.1秒上下,页面本身的HTML也在50K左右,经常都是页面标题已经显示出来一段时间了,但是页面还是空白的。可以说页面本身已经相当快了,但就是在加载脚本的时间花了比较长的时间。而通常情况下脚本的加载本身就是串行的下载方式,简单来说,当页面执行到脚本引用的位置,只有等到脚本下载完后,之后的HTML或javascript代码才会继续执行和呈现。而一般情况下,asp.net ajax注册的脚本都是在页面的HTML代码之前,又受到浏览器并行连接数的限制,使得多个脚本的下载更是雪上加霜。使得页面的展示只有等到asp.net ajax脚本加载完后才呈现出来。所以速度慢的体验就更加明显了。(更多关于脚本下载的优化建议可以参见JeffreyZhao《挣脱浏览器的束缚》系列文章)

到目前为止,我也不是特别确定,究竟就是由于下载慢,还是脚本多,初始化也需要比较多的时间。这种初始化不一定是load事件的初始化,还包括定义的类型的解析,如果类型的上下文解析也需要时间的话,那肯定就相当麻烦了。因为asp.net ajax几个核心脚本库,再加上如果你使用了Ajaxcontroltoolkit的话,那需要下载和初始化的脚本数量就非常多了,里面定义的函数和类数量也比javascript核心的还多。当然,这只是一种担忧,事实上可能并不这样的。我们还应该把目光集中脚本的加载上。

我想大多数使用者都不去关心asp.net ajax脚本的注册方式,通常情况下,我们只会关心脚本能否正常加载,正常执行。而不会去关心它是使用何种方式加载的。默认情况下,asp.net ajax都是加载脚本资源(程序集中的脚本资源文件)的方式(使用ScriptResource.axd加一段查询参数)来下载脚本。这种方式显然是非常方便,不需要我们手工指定或引用脚本,一切都交给ScriptManager来帮我们完成。殊不知,这里也会存在一些问题,那就是同一个程序,同个程序集资源,每次重启后都会得到不同的ScriptResource.axd的查询参数。也就是说,如果用户此次下载的脚本,也缓存在客户端了。但是当我们重启服务器后,客户端缓存的脚本就不再有效,就又必须再次下载新的脚本资源了。这样就造成了大量的资源浪费了。在这种情况下,最好的方式当然是以直接引用文件的会更好了。这时,我们就应该想起,在ScriptManager中,提供了一个ScriptPath属性,平常这是一个相当不起眼的属性,但是可别小瞧了它了。利用它我们就可以来实现我们目的。

先来说说ScriptPath这个属性的作用吧,它就是用来指定asp.net ajax的客户端脚本文件的路径。只要指定它的值,ScriptManager就去引用这个目录下的脚本文件,来代替程序集脚本资源。这样有一个好处就是方便我们可以修改asp.net ajax脚本资源(当然最好别去改它),另一好处就是如上所述的目的。指定了ScriptPath,它是如何引用脚本的?也就是如何确定脚本路径的?使用了ScriptPath,那么它的脚本文件必须放在ScriptPath目录下的 程序集名称/版本号/脚本资源名称 ,如:使用Javascript\System.Web.Extensions\1.0.61025.0\MicrosoftAjax.js ,来加载MicrosoftAjax.js。

这个ScriptPath,同时也对AjaxControlToolkit生效的,这时,我们可以把AajaxControlToolkit的脚本都放在:JavaScript\AjaxControlToolkit\1.0.10618.0 下文件的形式来引用。

通过使用ScriptPath,不管网站再如何重启,加载的都是同一份的脚本,这样就可以充分利用客户端缓存的功能。同时如果文章开头部分所述,我们还可以再使用一个优化,修改ScriptManager的行为,将脚本的注册放在HTML之后。当然这样可能会有一些不可预料的行为发生,比如脚本的加载事件不能被正确执行。这个修改就必须要因地制宜,或者说根据你当前的实际需求而定了。

阿不

posted on 2007-11-22 20:36  阿不  阅读(3387)  评论(20编辑  收藏  举报