`

构建高性能网站,针对前台工程师--总结篇

阅读更多

首先从一次完整的的请求说起:(以此为例get,www,baidu.com)

1,webbrower 发出request,

2,然后解析www.baidu.com为ip,找到ip的服务器,

3,服务器处理请求资源并返回请求的内容,

4,browser接受请求内容过程,(返回内容是按顺序读取的)

4.1遇到外联css,就会并发去读取css内容(),

4.2遇到图片时,回去并发读取图片,目前浏览器的并发数为2,

4.3遇到js时则会阻塞其他请求。

4.4加载完css后,browse开始渲染页面,

4.5直到加载完页面中的文本资源,这时dom的结构已经确定,会出发 document.ready方法

4.6 browse继续加载 图片和js,完成后。页面就全部加载完成,这时会出发 window.onload()方法

 

来分析一下里面具体的时间开销:

1,从1--4.4 用户才开始看到页面上有内容,在这以前页面就是空白的

2,解析域名也是有一定时间开销的,如果是大机房的可以通过路由配置 dns 缓存,依赖于外部机房环境,可控性比较小。  

3,这是服务器处理的时间,优化程序代码可以减少这里的时间

   4,

4.1浏览器在接收完css之前,一般是不去渲染dom的,以避免无所谓的刷新和闪烁。所以直到4.4用户才真正在页面上看到内容。

4.2 浏览器的单域名并发访问数 为2,多域名下并发数没限制,可以通过定义域名别名改善

4.3 浏览器加载js时会阻塞其他请求,直到加载完成。改善的话可以把js放到页面下面去加载。

 

从上面的流程可以分析出以下建议:

1,减少连接数(原因:并发限制,dns开销)

2,将css放到 head中。(1,首先这符合w3c规范,2,应为css加载完后,遇到dom对象时就会直接显示,可以更快的显示页面。)

3,将js放到页面底部,(加载js时会阻塞其他请求,这段时间页面没有反映,如果js中没有write的话应该放到底部,页面渲染完后再加载js)

4,减少下载内容(网络是有速度限制的,内容越少当然加载越快)

 

针对上面4条建议给出具体做法:

1,使用 css sprite将小图片合并,合并css、js。使用浏览器缓存: cache-control、expires。不使用etag

2、3不用说了,上面已经解释清楚了。

4,采用gzip压缩,可以使用 jsmin 将js精简,使用工具将css,html精简,尽可能缩减图片。

按照 性能黄金法则 说明: 文本内容只占所有时间的10%-20%, 这样做以后 至少能将时间缩小40%-50%。能明显改善用户体验。

 

这只是一些建议参考,具体的需要你针对自己的网站进行分析,分析工具可以使用firedebug,yslow,(这两个可以集成)

yslow会直接给出你建议。

 

 

分享到:
评论
31 楼 zhang8mss 2011-07-29  
总结的不错,支持
30 楼 feiyan35488 2011-05-27  
fch415 写道
这份总结和其后的回复看出,不是真正做过大网站前端优化的人(说明:我的领域跨过前后端)。

(除前文外)再指出几个明显的问题吧:
1)几乎不会真的用Jsmin做压缩,因为它存在一个严重的缺陷,就是当存在直接量的正则表达式时,代码会压缩出问题。
一般都是用YUI Comprosser。

2)一般不采用gzip方案,因为浏览器decode会有性能开销,如果服务器端打开动态gzip的encode更是吃不消。

3)真正做多域名时,不会只准备两个域名,而是一组域名的。
比如:
static1.xxx.com
static2.xxx.com
.....
static10.xxx.com
动态页面(比如JSP)会在每个URL前随机生成一个域名(1-10的随机数)。
而且为了有效利用304缓存(以免相同的URL每次的域名不同,导致无法利用HTTP缓存机制),还需要对URL做hash后的伪随机算法。

写了几个html页面,写几行后台hello代码,就敢说 领域跨过前后端。可笑
29 楼 int08h 2011-05-27  
fch415 写道
这份总结和其后的回复看出,不是真正做过大网站前端优化的人(说明:我的领域跨过前后端)。

(除前文外)再指出几个明显的问题吧:
1)几乎不会真的用Jsmin做压缩,因为它存在一个严重的缺陷,就是当存在直接量的正则表达式时,代码会压缩出问题。
一般都是用YUI Comprosser。

2)一般不采用gzip方案,因为浏览器decode会有性能开销,如果服务器端打开动态gzip的encode更是吃不消。

3)真正做多域名时,不会只准备两个域名,而是一组域名的。
比如:
static1.xxx.com
static2.xxx.com
.....
static10.xxx.com
动态页面(比如JSP)会在每个URL前随机生成一个域名(1-10的随机数)。
而且为了有效利用304缓存(以免相同的URL每次的域名不同,导致无法利用HTTP缓存机制),还需要对URL做hash后的伪随机算法。



那我也随便说说好了?
1、用什么压缩不是问题,现在google closure compiler也正在取代YUI,再过段时间也许你的YUI也一样是个“过时货”,压缩是个理念,何必纠结于JSMIN还是YUI?

2、decode的性能开销?你真有实测过用不用gzip浏览器的最终load差了多少?有的话给个数字吧?根据我们这边的实测,一个页面+3-5个gzip的资源(图片不会gzip),用不用gzip相关不到100毫秒来着。至于encode的开销,看服务器有多牛呗,不牛的就只对不变的静态资源开gzip,牛的就对动态页面也一起开了,顺便也要看看是你的服务器贵,还是你买的网络更贵,对吧?

3、多域名……我现在首先怀疑多域名的必要性,其次到底是2个还是多个,难道不是按照平均一个页面中的资源数量来决定的吗?难道一个页面只有6-7个资源,你也准备20个域名放着?
28 楼 damoqiongqiu 2011-05-27  
总结得非常好,学习了。
27 楼 feiyan35488 2011-05-27  
macrotea 写道
feiyan35488 的分享精神还是值得赞同的
我支持你!

谢谢,为了提高共同提高。最讨厌那些冒充高手到处喷粪的垃圾
26 楼 macrotea 2011-05-27  
feiyan35488 的分享精神还是值得赞同的
我支持你!
25 楼 feiyan35488 2011-05-27  
fch415 写道
这份总结和其后的回复看出,不是真正做过大网站前端优化的人(说明:我的领域跨过前后端)。

(除前文外)再指出几个明显的问题吧:
1)几乎不会真的用Jsmin做压缩,因为它存在一个严重的缺陷,就是当存在直接量的正则表达式时,代码会压缩出问题。
一般都是用YUI Comprosser。

2)一般不采用gzip方案,因为浏览器decode会有性能开销,如果服务器端打开动态gzip的encode更是吃不消。

3)真正做多域名时,不会只准备两个域名,而是一组域名的。
比如:
static1.xxx.com
static2.xxx.com
.....
static10.xxx.com
动态页面(比如JSP)会在每个URL前随机生成一个域名(1-10的随机数)。
而且为了有效利用304缓存(以免相同的URL每次的域名不同,导致无法利用HTTP缓存机制),还需要对URL做hash后的伪随机算法。

你倒是做过,你烂在肚子里有什么用。我是后台开发的,看了看书,顺便总结一下。有本事你也总结一下啊
24 楼 fch415 2011-05-26  
这份总结和其后的回复看出,不是真正做过大网站前端优化的人(说明:我的领域跨过前后端)。

(除前文外)再指出几个明显的问题吧:
1)几乎不会真的用Jsmin做压缩,因为它存在一个严重的缺陷,就是当存在直接量的正则表达式时,代码会压缩出问题。
一般都是用YUI Comprosser。

2)一般不采用gzip方案,因为浏览器decode会有性能开销,如果服务器端打开动态gzip的encode更是吃不消。

3)真正做多域名时,不会只准备两个域名,而是一组域名的。
比如:
static1.xxx.com
static2.xxx.com
.....
static10.xxx.com
动态页面(比如JSP)会在每个URL前随机生成一个域名(1-10的随机数)。
而且为了有效利用304缓存(以免相同的URL每次的域名不同,导致无法利用HTTP缓存机制),还需要对URL做hash后的伪随机算法。
23 楼 feiyan35488 2011-05-06  
int08h 写道
以总结为主,引发一个话题,其他有研究的人可以借此平台来分享进一步的知识,这就是论坛啊,有什么不好

  
22 楼 int08h 2011-05-06  
以总结为主,引发一个话题,其他有研究的人可以借此平台来分享进一步的知识,这就是论坛啊,有什么不好
21 楼 feiyan35488 2011-05-06  
lz12366 写道
麻烦以后如果是摘录书籍的东西,请注释下。。。

不是摘录,集合平常经验总结的
20 楼 lz12366 2011-05-06  
麻烦以后如果是摘录书籍的东西,请注释下。。。
19 楼 meepo3927 2011-05-06  
非常不错啊。
18 楼 int08h 2011-05-03  
printfabcd 写道
int08h 写道
1、并发数并不是绝对的2,IE6-7为2,IE8、Firefox、Chrome为6,Opera为16
2、遇到js下载时不会阻塞其他请求(除IE6-7外)
3、用script标签写出来的js文件必须加载、解析、执行完成后,才会触发DOMReady,和你说的不一样
4、事实上link和style这2个标签只能放在head中,放在body中是不符合标准的,楼主说得很对,这里强调科普下~(除非style有scoped属性,不过很少人知道这属性)

总得来说,楼主还是仅仅从网上收集了一些“教条”和“圣经”,以及一些大家普遍在宣扬着的数据,似乎没有亲身实测过,这里还是自我推荐下我的研究:
http://www.otakustay.com/browser-strategy-loading-external-resource/

请问,js可以并行的加载那些js的时候,怎么保证,js脚本按照正确的顺序到达浏览器呢?,下面的脚本可能要依赖上面的脚本才能运行


别这么想啊,他就不能到达浏览器了也藏着不执行嘛~反正保证执行顺序正常就OK了啊
17 楼 printfabcd 2011-05-03  
int08h 写道
1、并发数并不是绝对的2,IE6-7为2,IE8、Firefox、Chrome为6,Opera为16
2、遇到js下载时不会阻塞其他请求(除IE6-7外)
3、用script标签写出来的js文件必须加载、解析、执行完成后,才会触发DOMReady,和你说的不一样
4、事实上link和style这2个标签只能放在head中,放在body中是不符合标准的,楼主说得很对,这里强调科普下~(除非style有scoped属性,不过很少人知道这属性)

总得来说,楼主还是仅仅从网上收集了一些“教条”和“圣经”,以及一些大家普遍在宣扬着的数据,似乎没有亲身实测过,这里还是自我推荐下我的研究:
http://www.otakustay.com/browser-strategy-loading-external-resource/

请问,js可以并行的加载那些js的时候,怎么保证,js脚本按照正确的顺序到达浏览器呢?,下面的脚本可能要依赖上面的脚本才能运行
16 楼 feiyan35488 2011-04-26  
yanyan_zhl 写道
和这个很相像,吼吼...

http://blog.aixiaogou.com/?p=13

这些都是 《构建高性能网站》 书中的,我结合自己的理解总结一下
15 楼 enix2212 2011-04-25  
接电话都需要攻城狮干了啊
14 楼 yanyan_zhl 2011-04-25  
和这个很相像,吼吼...

http://blog.aixiaogou.com/?p=13
13 楼 int08h 2011-04-24  
axxxx2000 写道
int08h 写道
定义一个新的域名来加载图片,如果新域名和原域名依旧指向一台服务器的话,其实唯一的作用就是增大HTTP请求并行度,但是现在浏览器6的并行度完全够用了,除非你做淘宝搜索页之类的大量图片构成的页面
另外,如果新开域名的话,注意一个事,尽可能保证服务静态资源的域没有cookie,所以永远不要把cookie写到二级域名下去

嘿嘿,问下尽可能保证服务静态资源的域没有cookie  这个真不明白...能讲解下不?


一次HTTP GET Request中唯一不能确定大小的只有2点,1是URL长度,2是cookie的内容,其他的所有HTTP头都由浏览器生成,且可以很容易找出规律并大小固定

所以对单次GET型的HTTP请求的优化,主要就集中在控制URL的长度和cookie的大小上,而这两者一比较,cookie的大小又占了比较大的比重(毕竟URL因为要有明确的表意性,有时不是那么容易优化的,或者说优化了也不会有太多的区别)
12 楼 feiyan35488 2011-04-24  
axxxx2000 写道
int08h 写道
定义一个新的域名来加载图片,如果新域名和原域名依旧指向一台服务器的话,其实唯一的作用就是增大HTTP请求并行度,但是现在浏览器6的并行度完全够用了,除非你做淘宝搜索页之类的大量图片构成的页面
另外,如果新开域名的话,注意一个事,尽可能保证服务静态资源的域没有cookie,所以永远不要把cookie写到二级域名下去

嘿嘿,问下尽可能保证服务静态资源的域没有cookie  这个真不明白...能讲解下不?

如果域名下有cookie的话,这个cookie的也会传到server中,增加请求内容和响应内容。
只是静态资源的话,这些cookie是没有必要的。所以增加cookie只会请求的时间开销。

相关推荐

    JavaEE求职简历-姓名-JAVA开发工程师-范文.doc

    【JavaEE求职简历-姓名-JAVA开发工程师-范文.doc】是一个详尽的Java开发工程师求职简历,涵盖了候选人的个人信息、教育背景、技能掌握、项目经验和技术难点等方面。这份简历展示了应聘者在JavaEE领域的深厚技术积累...

    Java软件开发工程师简历模板.docx

    - 技术栈:使用Varish + Spring Cloud + MongoDB + Redis + RabbitMQ等技术构建高性能的资料共享平台。 - 项目亮点:实现了多端融合,支持PC站、手机M站、小程序、APP等多种终端访问,满足不同用户需求。 - 个人贡献...

    基于Android的联想Android开发工程师面试题.zip

    针对"基于Android的联想Android开发工程师面试题",我们可以深入探讨一些关键知识点,这些知识点对于学习Android的同学和毕业生来说至关重要。以下是一些可能在面试中遇到的重点: 1. **Android基础知识**: - ...

    前台开发技术pdf

    在IT行业中,前端开发是构建互联网应用不可或缺的一部分,它涉及到用户与网站或应用程序交互的所有界面。"前台开发技术"是一个广泛的主题,涵盖了多种技术和实践,包括HTML、CSS、JavaScript以及各种框架和库,如...

    精通Andriod 4(Pro.Android.4).pdf

    适合于希望深入了解Android开发的软件工程师、应用开发者及技术爱好者等。 #### 二、核心章节概述 1. **第1章:介绍Android计算平台** - 讨论了手持设备如何转变为计算平台。 - 分析了手机和平板电脑作为通用...

    阿里技术参考图册算法篇

    阿里集团作为全球知名的电商平台,其背后拥有复杂的技术支撑体系,其中包括高性能基础设施、集群调度系统、分布式存储引擎、数据库技术以及分布式中间件等。 首先,阿里集团在高性能基础设施方面做了大量工作。例如...

    某集团网站建设方案(doc 22页).docx

    - 包括项目经理、设计师、前端工程师、后端工程师、测试人员等角色的分工合作,确保项目按时高质量完成。 #### 七、系统的管理和控制 - 重点在于如何维护系统的稳定性、安全性以及高效性,具体措施可能包括定期的...

    软件测试工程师培训教程

    《软件测试工程师培训教程》是针对希望深入了解软件测试领域并准备从事此行业的读者设计的一本专业书籍。本书由新科海学校刘德宝编著,于2008年出版,旨在提供全面而深入的软件测试知识,涵盖基础理论、测试管理、...

    第一阶段 第一天 server服务器

    - **硬件**:本质上是一台高性能的计算机。 - **软件**:安装有特定的服务软件,如Web服务器、数据库服务器等,用于提供各种服务。 #### 访问服务器方式 - **域名/IP地址**:用于定位服务器的位置。 - **端口号**...

    校园音乐网站需求分析ppt

    这份PPT由轻灵之梦工作室的黑龙江科技学院JSP开发小组制作,主要针对校园音乐网站的项目经理、系统分析员、设计人员、开发工程师和测试团队。 **项目背景** 项目名为校园音乐网站,由黑龙江科技学院的轻灵之梦工作...

    Android开发_2年工作经验Android软件工程师求职简历个人简历.pdf

    这份简历是一位拥有两年工作经验的...总结起来,这位工程师具有全面的Android开发技能,不仅精通基础技术,还熟悉各种高级特性和开源库的使用。他的专业能力和积极态度使他成为寻找Android开发岗位的有力竞争者。

    Android OPhone 开发完全讲义

    - **第16章 NDK编程**:讲解如何利用C/C++编写高性能的应用模块。 - **第17章 整合Android与脚本语言**:探讨如何结合Python、Lua等脚本语言进行开发。 - **第18章 Android平台的新特性展示**:介绍Android最新的...

    生活分类信息发布网站的优秀网站管理系统正式版

    本分类信息网站建站系统正式版是本公司专业网站软工程师团队花费二年时间精心开发制作的分类信息发布网程序,现免费提供强大的分类信息网后台管理系统,应用本信息网站建站软件,可建立有全国各地分站功能的地方生活...

    网软志成分类信息网站系统.net官方商业版

    本分类信息网站建站系统正式版是本公司专业网站软工程师团队花费二年时间精心开发制作的分类信息发布网程序,现免费提供强大的分类信息网后台管理系统,应用本信息网站建站软件,可建立有全国各地分站功能的地方生活...

    面试整理-背诵版.pdf

    2. **构建打包**:自动或手动构建可测试的软件包。 3. **环境准备**:确保测试环境准备好接收新版本。 4. **通知测试**:通知测试团队进行测试。 #### 1.23 如果时间比较紧的话,你怎么安排你的工作 1. **优先级...

    LPC2210用户说明书

    ### LPC2210微控制器的关键知识点 #### 引言 LPC2210是一款高性能的16/32位微控制器,基于ARM7TDMI-S架构,由广州周立功...无论是对于初学者还是经验丰富的工程师,LPC2210都是构建高性能嵌入式系统的一个理想选择。

    阿里技术参考图册》(算法篇)

    书中提到了支撑商业系统的高性能基础设施,包括绿色数据中心、自研网络、定制化芯片与服务器、异构计算。例如,阿里巴巴的绿色数据中心采用了浸没液冷服务器集群技术,PUE值接近理论极限1.0,展示了在降低能耗方面的...

    某酒店管理信息化方案.docx

    - **技术层面**:采用最新的计算机技术和网络架构,确保系统的高性能和稳定性。 - **用户体验**:提供快速、准确的服务,提升客户满意度。 - **管理效率**:简化内部管理流程,提高工作效率。 - **安全性保障**:...

    99-数据治理通用能力需求规格书V1.1.docx

    - **计算框架**:具备高性能的数据处理能力,支持多种应用需求。 **大数据处理能力:** - **处理流程**:数据清洗、转换、提取、计算等。 - **处理方式**:解码/编码、聚合/拆解、过滤/抽取、中转/分发等。 - **...

    基于vue_cli3 node.js的英语题库系统设计与实现.docx

    - **研究背景**:随着Web应用开发的日益复杂,传统的开发模式已不能满足高效、高质量的应用开发需求。前后端分离的概念逐渐兴起,成为现代Web开发的趋势之一。Vue.js作为一种新兴的前端框架,凭借其轻巧、灵活的特点...

Global site tag (gtag.js) - Google Analytics