标题: [原创] 如何快速的呈现我们的网页
flashsoft
管理员
Rank: 9Rank: 9Rank: 9



UID 182
精华 13
积分 1881
帖子 2981
威望 212
阅读权限 200
注册 1970-1-1
状态 离线
 
发表于 2007-6-15 10:28  资料  个人空间  短消息  加为好友 
如何快速的呈现我们的网页

如何加快网页呈现速度

一.我们需达解决的麻烦
        A.减少HTTP请求数.
                减少HTTP请求数有什么好处:
                       降低服务器跟客户端的建立和消除HTTP请求和响应Header的开销
                         减少服务器为HTTP连接的进程和线程的开销,如果可能,还会包括GZIP压缩的CPU开销.
        B.减小被请求文件大小, 减少请求数据占用的网络带宽.
        C.让用户更快的看到想要的结果.
        D.提高客户端渲染速度.
        E让浏览器同时能请求更多的数据.
        F.提高服务器相应速度.
        G.通过版本化控制客户端Cache.

二.如何解决我们的麻烦

        A.如何减少HTTP请求数
                1.合并JS文件跟 CSS文件.
                       
                2.合并框架图片以及相对变动较少的图片成一张,通过CSS背景切割来完成渲染.
                3.合理使用本地Cache来缓存JS/CSS/IMAGE.
                                4.合理使用UserData缓存JS文件,对于FF用户可以单独请求服务器,这样能解决80%用户的问题.
                                5.把JS跟CSS合并成一个文件
                     写法如下:
                                        <?header('Content-type: */*');?>
                                        <!-- /*
                                        window.onload=function(){
                                                document.getElementById("test2").innerHTML="传说中滴JS测试者。如果你看到我,那<strong>JS</strong>也生效了";
                                        }
                                        <!-- */
                                        <!-- #test1,#test2{border:3px #000 solid;padding:5px;color:#123456;background-color:#ccc;} strong{color:red;}
                                        以上内容的文件同时被JS跟Style引用,都是有效的

        B.减小被请求文件大小,减少请求数据占用的网络带宽
                1.压缩JS体积
                        删除JS中空白换行,注释,混淆把长变量换成短变量
                2.压缩CSS体积
                        删除CSS注释
                        CSS中的写法尽量用简写,比如:
                                .bak{background:url(sina.gif) no-repeat left};
                3.使用DIV+CSS方式搭建网站结构,提高CSS重用性,来减少HTML文件大小.
                4.使用服务器端GZIP压缩JS/ CSS文件,缩小传输文件大小.
                        附注:Apache1跟Apache2的GZIP的效率跟方式不一样的,根据需要自行选择

        C.让用户更快的看到想要的结果
                用户对于一个站点的白页的忍受时间根据统计是8-12秒.
        对于用户能忍受的页面白页时间是8-10秒, 白页的产生可能由于各种原因引起,我们能做的就是怎么让用户能变的稍微能等待更久.

                方案1.多做一个引导页,让用户体会其中的变化
                                案例:mail.aol.com中的loading引导页
                                 
                               
                方案2.优先载入页面结构以及结构图片,后一步载入当前页面数据,再后        一步载入Iframe,Flash等数据.让用户尽早的看到被打开页面的希望.

        D.提高客户端渲染速度
                这个问题就比较泛泛了,影响客户端的渲染速度有多方面的,主要目的都是提高程序方面的效率.
                1.        对于大索引的结构,尽可能的少用索引访问,能用访问兄弟节点的方式尽可能用访问兄弟节点的方式.
                var t1=new Date();
                var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
                xmlDoc.async="false";
                xmlDoc.load("xml.xml");
                var node=xmlDoc.documentElement.firstChild;
                var a=[],i=-1;
                do a[++i]=node.getAttribute("text");
                while(node=node.nextSibling);
                a=a.join("");
                document.write(a.length);
                alert(new Date()-t1);
                2.        字符串拼接尽可能用数组方式
                <script language="JScript">
                function StringBuilder(sString){//字符串连接操作类
                        this.length=0;
                        this.append=function(sString){
                                this.length+=(this._parts[this._current++]=String(sString)).length;
                                this._string=null;
                                return this;
                                }
                        this.toString=function(){
                                if(this._string!=null)
                                        return this._string;
                                var s=this._parts.join("");
                                this._parts=[s];
                                this._current=1;
                                return this._string=s;
                                }
                        this._current=0;
                        this._parts=[];
                        this._string=null;
                        if(sString!=null)
                                this.append(sString);
                        }
                var str=new StringBuilder();
                str.append("a");
                str.append("b");
                alert(str.toString());
                </script>
                3.        大规模添加节点数据,请不要使用appendChild方式,尽量使用类似innerHTML的insertAdjacentHTML方式,FF下需修正
                function addHTML(oParentNode, sHTML) {
                        if(window.addEventListener) {// for MOZ
                                var oRange = oParentNode.ownerDocument.createRange();
                                oRange.setStartBefore(oParentNode);
                                var oFrag = oRange.createContextualFragment(sHTML);
                                oParentNode.appendChild(oFrag);
                        }
                        else {// for IE5+
                                oParentNode.insertAdjacentHTML("BeforeEnd", sHTML);
                        }
                }

        E让浏览器同时能请求更多的数据.
                浏览器默认只是支持单域名同时有两个HTTP请求,使用多域名将能把请求数提高,在网络条件优良的情况下,能更快的下载数据,呈现结果.
                对于images2这样的机器,为什么能同时有超过2个以上请求数,有待考察.

F.对于需快速响应的文件,把其放入快速响应的服务器,应该是不错的方案,优化方案请系统储备组提供.

G.通过版本化控制客户端Cache.
        通常js/css这类文件改动比较频繁,但是为了加载速度变快,我们有可能需要设定这类文件的过期时间为几天后,这样我们碰到的问题就是,如何及时更新这些在cache的文件?
        通过一个简单的配置,通过修改JS的版本来及时告诉浏览器,这些文件必须重新请求了,不要继续使用浏览器cache中的数据.
        方案有好几个:
                1.        手动改这些js的文件名
                2.        手动改这些js的路径
                3.        通过URL Rewrite方式来改重定位js路径
                4.        通过一个在高响应服务器上的一个js配置告知页面,这个页面该链接哪些JS文件
                5.        大版本不变,小版本不断追加,等一定时间后,统一更新,高效利用cache


本帖最近评分记录
月影   2007-6-20 10:47  威望  +5   太好了,我也可以抄到作业里边不??^^
dron   2007-6-15 19:29  威望  +5   版本化并强制缓存 js/css 文件比较实用 ...
eoe   2007-6-15 17:23  威望  +5   =。= 在群里搞了那样复杂.原来是为了交作业
顶部
cosin
霸王龙
Rank: 6Rank: 6



UID 8043
精华 0
积分 2417
帖子 718
威望 765
阅读权限 70
注册 2004-1-15
状态 离线
 
发表于 2007-6-15 10:39  资料  个人空间  短消息  加为好友 
写一个最简单的 Loading,文件大小应该在 1KB 上下,其他的可以慢慢 Loading...

顶部
brull
霸王龙
Rank: 6Rank: 6



UID 35270
精华 1
积分 1095
帖子 377
威望 433
阅读权限 70
注册 2005-8-16
状态 离线
 
发表于 2007-6-15 12:32  资料  个人空间  短消息  加为好友 
总的来说方法都挺好,从全局着眼。
个人看法:
有些办法稍为麻烦,比如js和CSS文件合并,如果是小站点个人觉得还是简单起见为好。
版本化本地cache还有一种办法就是在url后面加一个版本。比如:src=“a.js?v1.0”
另外想请教一下,userdata和本地cache有什么区别?
拜托,第一个标题就有个错别字 。文字好像从word copy过来的,有点乱

顶部
Rimifon (无名)
超级版主
Rank: 8Rank: 8
新手上路


UID 11749
精华 3
积分 5914
帖子 3203
威望 3193
阅读权限 150
注册 2004-5-22
来自 湖南长沙
状态 离线
 
发表于 2007-6-15 13:09  资料  个人空间  主页 短消息  加为好友  添加 Rimifon 为MSN好友 通过MSN和 Rimifon 交谈
flashsoft把js和css写到一个文件里面去了
发现css弄不好会反而影响速度。有时候动动鼠标就会出现页面图片刷新的现象,而且IE进度条也在提示下载图片。





風雲工作室
=========
广告位招租(做在老百姓眼皮底下的广告)
顶部
Rimifon (无名)
超级版主
Rank: 8Rank: 8
新手上路


UID 11749
精华 3
积分 5914
帖子 3203
威望 3193
阅读权限 150
注册 2004-5-22
来自 湖南长沙
状态 离线
 
发表于 2007-6-15 13:13  资料  个人空间  主页 短消息  加为好友  添加 Rimifon 为MSN好友 通过MSN和 Rimifon 交谈
加快页面布局的速度可以在两方面下手:
1、使用ajax刷新局部。
2、页面整体布局使用div + css

table+外部script是最影响界面显示速度的。





風雲工作室
=========
广告位招租(做在老百姓眼皮底下的广告)
顶部
秦皇也爱JS
霸王龙
Rank: 6Rank: 6
网恋? 妄念!


UID 67036
精华 0
积分 2268
帖子 1269
威望 1203
阅读权限 70
注册 2007-3-27
来自 湖北武汉
状态 离线
 
发表于 2007-6-15 13:17  资料  个人空间  短消息  加为好友  QQ
呵呵  学到东西了





"我要印"印刷商务平台     和我聊聊
自从一见桃花后,直至如今更不疑!
顶部
cosin
霸王龙
Rank: 6Rank: 6



UID 8043
精华 0
积分 2417
帖子 718
威望 765
阅读权限 70
注册 2004-1-15
状态 离线
 
发表于 2007-6-15 13:25  资料  个人空间  短消息  加为好友 
我的主文件就一行 <script language="JavaScript" src="check.js">
check.js 里 load boot.js
boot.js 里实现一个 简易 Loader
CSS & HTML 是完全用 JScript 生成的,不用CSS文件

突然发现变 霸王龙 了

顶部
flashsoft
管理员
Rank: 9Rank: 9Rank: 9



UID 182
精华 13
积分 1881
帖子 2981
威望 212
阅读权限 200
注册 1970-1-1
状态 离线
 
发表于 2007-6-15 15:27  资料  个人空间  短消息  加为好友 


QUOTE:
原帖由 [i]Rimifon[/i] 于 2007-6-15 13:09 发表
flashsoft把js和css写到一个文件里面去了
发现css弄不好会反而影响速度。有时候动动鼠标就会出现页面图片刷新的现象,而且IE进度条也在提示下载图片。

借用论坛某兄弟的程序

http://www.ggxj.com/flashsoft/huadong/index.html
http://www.ggxj.com/flashsoft/huadong/index2.html

去体会两者的不同

顶部
flashsoft
管理员
Rank: 9Rank: 9Rank: 9



UID 182
精华 13
积分 1881
帖子 2981
威望 212
阅读权限 200
注册 1970-1-1
状态 离线
 
发表于 2007-6-15 15:37  资料  个人空间  短消息  加为好友 


QUOTE:
原帖由 [i]brull[/i] 于 2007-6-15 12:32 发表
总的来说方法都挺好,从全局着眼。
个人看法:
有些办法稍为麻烦,比如js和CSS文件合并,如果是小站点个人觉得还是简单起见为好。
版本化本地cache还有一种办法就是在url后面加一个版本。比如:src=“a.js?v ...

的确是从word里copy过来的
是最近部门做技术反刍的时候,我写的一篇关于影响网页呈现速度的一些元素

关于你的说的:
JS跟CSS合并,可以由程序去完成
JS代码压缩整理-->CSS代码压缩--->JS跟CSS合并,都是程序做的

本地cache的处理主要是由apache来做的过期时间
当然ETAG也可以作为一种优化手段

QUOTE:
版本化本地cache还有一种办法就是在url后面加一个版本。比如:src=“a.js?v ...

如果引用JS的地方非常多呢
那就改动起来非常的繁复并且容易出错
比较好的方式还是通过config.js配置一些数组,每个下标都对应相应的页面
比如:
config.js
-----------------------------
var JSHash = {
index: [{url:"http://xxxx.js", charset: "gb2312"}],
edit:  [{url:"http://xxxx.js", charset: "gb2312"}]

}
function loadJS(sKey) {
        var node = JSHash[sKey];
        for(var i =0;i < node.length; i ++) {
                document.writeln('<script src="'+node[i].url+'" charset="'+node[i].charset+'"><\/script>');
        }
}
//-->
</script>

那么相应的页面只要写
---------------------
<script src=config.js></script>
<script>
loadJS("edit");
</script>

这样,轻松的在config.js里控制着js的版本即可
因为这个config.js放在了高响应的服务器上,所以不论是200还是304都是可以接受的,其他js文件可以大胆的设定超期时间为一周

顶部
flashsoft
管理员
Rank: 9Rank: 9Rank: 9



UID 182
精华 13
积分 1881
帖子 2981
威望 212
阅读权限 200
注册 1970-1-1
状态 离线
 
发表于 2007-6-15 15:56  资料  个人空间  短消息  加为好友 
其实我们的目标只有一个
页面的html是只能200或者304的[可gzip]
config.js只能是200或者304的[可gzip]
其他的css跟js完全可以大量使用浏览器cache

剩下就是动态载入的数据是必须200或者304的[可gzip]
优化完毕以上的以后,剩下就是优化图片
图片分为img标签载入跟css的background载入
img标签的图片也分为经常更新的跟经常不更新的
分别采取不同的过期时间来处理

至于还有一些css中的图片,能合并的就合并,因为一个图片的304跟多个图片合并后的304时间其实差不多一样的,当然高速网络环境看不出差别,低速的时候就很明显了

css切割用是用,但是也别滥用就好

技术是为我们服务的

顶部
flashsoft
管理员
Rank: 9Rank: 9Rank: 9



UID 182
精华 13
积分 1881
帖子 2981
威望 212
阅读权限 200
注册 1970-1-1
状态 离线
 
发表于 2007-6-15 15:59  资料  个人空间  短消息  加为好友 


QUOTE:
原帖由 [i]cosin[/i] 于 2007-6-15 13:25 发表
我的主文件就一行
check.js 里 load boot.js
boot.js 里实现一个 简易 Loader
CSS & HTML 是完全用 JScript 生成的,不用CSS文件

突然发现变 霸王龙 了

拿你做个反面例子,别见怪:)

QUOTE:
CSS & HTML 是完全用 JScript 生成的,不用CSS文件

这就是属于因噎废食的代表,过度的优化导致开发的不效率,写css的不方便.......

顶部
cosin
霸王龙
Rank: 6Rank: 6



UID 8043
精华 0
积分 2417
帖子 718
威望 765
阅读权限 70
注册 2004-1-15
状态 离线
 
发表于 2007-6-15 16:08  资料  个人空间  短消息  加为好友 


QUOTE:
原帖由 [i]flashsoft[/i] 于 2007-6-15 15:59 发表

拿你做个反面例子,别见怪:)



这就是属于因噎废食的代表,过度的优化导致开发的不效率,写css的不方便.......

css生成方法,其实和写 css 文件一样简单。。。
不是用 $(xx).style.xxx = xxx 的
document.css = document.createStyleSheet(xxx)
document.css.addRule(<Name>, <Style>)

至于 HTML 生成,我封装了下,代码手上没有
其实用的方法比写 HTML 没有复杂多少,其实就字符数来看,还少很多

[[i] 本帖最后由 cosin 于 2007-6-15 16:11 编辑 [/i]]

顶部
ttyp
小恐龙
Rank: 3Rank: 3



UID 5334
精华 0
积分 322
帖子 139
威望 144
阅读权限 30
注册 2003-9-3
状态 离线
 
发表于 2007-6-15 16:12  资料  个人空间  短消息  加为好友 

顶部
cosin
霸王龙
Rank: 6Rank: 6



UID 8043
精华 0
积分 2417
帖子 718
威望 765
阅读权限 70
注册 2004-1-15
状态 离线
 
发表于 2007-6-15 16:15  资料  个人空间  短消息  加为好友 
哦,另外补充一点
用完了没用的 JScript 代码段,我可以卸载掉
这个是经过测试的

[[i] 本帖最后由 cosin 于 2007-6-15 16:34 编辑 [/i]]

顶部
ttyp
小恐龙
Rank: 3Rank: 3



UID 5334
精华 0
积分 322
帖子 139
威望 144
阅读权限 30
注册 2003-9-3
状态 离线
 
发表于 2007-6-15 16:17  资料  个人空间  短消息  加为好友 
写的不错,基本上很全面

顶部
ttyp
小恐龙
Rank: 3Rank: 3



UID 5334
精华 0
积分 322
帖子 139
威望 144
阅读权限 30
注册 2003-9-3
状态 离线
 
发表于 2007-6-15 16:18  资料  个人空间  短消息  加为好友 
还有个动态加载脚本

顶部
编程浪子
霸王龙
Rank: 6Rank: 6


UID 44744
精华 0
积分 2619
帖子 995
威望 922
阅读权限 70
注册 2005-12-24
来自 深圳-广州-上海-北京
状态 离线
 
发表于 2007-6-15 16:50  资料  个人空间  短消息  加为好友 


QUOTE:
原帖由 [i]flashsoft[/i] 于 2007-6-15 15:37 发表
JS跟CSS合并,可以由程序去完成
JS代码压缩整理-->CSS代码压缩--->JS跟CSS合并,都是程序 ...

flashsoft有什么好的工具么,在网上找了很多压缩整理的工具,无一不出错的,如果再没有,准备自己写了

另外,我觉得目前的JS FrameWork都不是很理想,一个小小的程序,动则就要加入几十K代码,而有很大一部分是没有用到的,所以我认为最理想的状态是把代码写在数据库里,分门别类放好,用什么功能就导入什么类或函数,然后发布的时候合成一个文件,就像传统语言的“编绎”一样,这样可以保证网页不受污染,而且该实现的功能都实现了!





顶部
cosin
霸王龙
Rank: 6Rank: 6



UID 8043
精华 0
积分 2417
帖子 718
威望 765
阅读权限 70
注册 2004-1-15
状态 离线
 
发表于 2007-6-15 16:56  资料  个人空间  短消息  加为好友 


   提示:您可以先修改部分代码再运行

这样的 CSS 脚本生成方法,难道比写CSS文件复杂么?

而且还可以再封装一下用个 数组来存放 CSS 内容,用程序循环读取调用 document.css.addRule
那么在表现形式上,基本和 css 文件已经没有太大区别了

PS:如果不是因为 JScript 不支持 '#' 和 '*' 做变量名,甚至可以直接写成
cssDesc = {
        * : "font-size:9pt",
        html : "margin:0px",
        body : "margin:0px;background-color:#000000",
        #text : "color:#FFFFFF;border:1px solid red;text-align:center",
}

[[i] 本帖最后由 cosin 于 2007-6-15 17:04 编辑 [/i]]

顶部
flashsoft
管理员
Rank: 9Rank: 9Rank: 9



UID 182
精华 13
积分 1881
帖子 2981
威望 212
阅读权限 200
注册 1970-1-1
状态 离线
 
发表于 2007-6-15 17:11  资料  个人空间  短消息  加为好友 


QUOTE:
原帖由 [i]cosin[/i] 于 2007-6-15 16:56 发表


Just A Test Line


document.css = document.createStyleSheet();
document.css.addRule("*", "font-size:9pt");
document.css.addRule("html body", "margin:0px");
document.css.addRule("body",  ...

基于你的想法,其实完全可以把css丢入一个变量,然后自己的解析器拆分解析即可

顶部
cosin
霸王龙
Rank: 6Rank: 6



UID 8043
精华 0
积分 2417
帖子 718
威望 765
阅读权限 70
注册 2004-1-15
状态 离线
 
发表于 2007-6-15 17:17  资料  个人空间  短消息  加为好友 


QUOTE:
原帖由 [i]flashsoft[/i] 于 2007-6-15 15:59 发表

拿你做个反面例子,别见怪:)



这就是属于因噎废食的代表,过度的优化导致开发的不效率,写css的不方便.......

写代码是为了证明
第一 并没有开发的不效率
第二 CSS的写法没有什么不方便

说实话,因为是在脚本中生成 CSS,所以在生成前可以根据不同的浏览器动态调用不同的 CSS 生成 JScript 文件,
比传统的 CSS 文件中的各种恶心的 hack 写法来适应不同的浏览器要好
还省了不少字节。。。

QUOTE:
原帖由 [i]flashsoft[/i] 于 2007-6-15 17:11 发表

基于你的想法,其实完全可以把css丢入一个变量,然后自己的解析器拆分解析即可

我的HTML生成就是这种思路,晚上找到代码,贴上来来讨论讨论

[[i] 本帖最后由 cosin 于 2007-6-15 17:30 编辑 [/i]]

顶部
 



当前时区 GMT+8, 现在时间是 2010-7-31 04:39
苏ICP备05080427号

Powered by Discuz! 5.5.0  © 2001-2007 51JS.COM
Processed in 0.272222 second(s), 9 queries , Gzip enabled

清除 Cookies - 联系我们 - 无忧脚本 - Archiver