读书人

网页加载历程详解

发布时间: 2012-11-25 11:44:31 作者: rapoo

网页加载过程详解

?

网页加载的详细步骤拆分:

1、用户打开url链接

2、浏览器查询url的dns地址

3、提交url请求到服务器端

4、服务器端处理

5、传输处理好的html文本内容到浏览器

6、浏览器解析html,并加载css,js,图片等内容

7、加载完成,用户看到完整的页面内容

其中第六步的浏览器解析过程将是前端优化最直接、有效的地方,该过程的详细过程为:接受网络数据-》将二进制码变成字符-》将字符变为unicode code points.-》tokenizer -》tree constructor -》DOM ready -》Window ready。前端编程,主要理解的是tree constructor -> dom ready -> window ready的流程。

?

浏览器加载和渲染html的顺序

1.?IE下载的顺序是从上到下,渲染的顺序也是从上到下,下载和渲染是同时进行的。

2.?在渲染到页面的某一部分时,其上面的所有部分都已经下载完成(并不是说所有相关联的元素都已经下载完)。

3. 如果遇到语义解释性的标签嵌入文件(JS脚本,CSS样式),那么此时IE的下载过程会启用单独连接进行下载。

4. 样式表在下载完成后,将和以前下载的所有样式表一起进行解析,解析完成后,将对此前所有元素(含以前已经渲染的)重新进行渲染。

5. JS、CSS中如有重定义,后定义函数将覆盖前定义函数。

JS的加载(js是单线下载和执行的)

1.?不能并行下载和解析(阻塞下载)。

2.?当引用了JS的时候,浏览器发送1个js request就会一直等待该request的返回。因为浏览器需要1个稳定的DOM树结构,而JS中很有可能有

代码直接改变了DOM树结构,比如使用 document.write 或 appendChild,甚至是直接使用的location.href进行跳转,浏览器为了防止出现JS修

改DOM树,需要重新构—OM树的情况,所以 就会阻塞其他的下载和呈现.

?

如何加快HTML页面加载速度

1.?页面减肥:

a. 页面的肥瘦是影响加载速度最重要的因素。

b. 删除不必要的空格、注释。

c. 将inline的script和css移到外部文件。

d. 可以使用HTML Tidy来给HTML减肥,还可以使用一些压缩工具来给JavaScript减肥。

2.?减少文件数量:

a. 减少页面上引用的文件数量可以减少HTTP连接数。

b. 许多JavaScript、CSS文件可以合并最好合并,人家财帮子都把自己的JavaScript. functions和Prototype.js合并到一个base.js文件里去了。

3. 减少域名查询:

a. DNS查询和解析域名也是消耗时间的,所以要减少对外部JavaScript、CSS、图片等资源的引用,不同域名的使用越少越好。

4. 缓存重用数据:

a. 对重复使用的数据进行缓存。

5. 优化页面元素加载顺序:

a. 首先加载页面最初显示的内容和与之相关的JavaScript和CSS,然后加载HTML相关的东西,像什么不是最初显示相关的图片、flash、视频

等很肥的资源就最后加载。

6. 减少inline JavaScript的数量:

a. 浏览器parser会假设inline JavaScript会改变页面结构,所以使用inline JavaScript开销较大。

b. 不要使用document.write()这种输出内容的方法,使用现代W3C DOM方法来为现代浏览器处理页面内容。

7.?使用现代CSS和合法的标签:

a. 使用现代CSS来减少标签和图像,例如使用现代CSS+文字完全可以替代一些只有文字的图片。

b. 使用合法的标签避免浏览器解析HTML时做“error correction”等操作,还可以被HTML Tidy来给HTML减肥。

8.?Chunk your content:

a. 不要使用嵌套table,而使用非嵌套table或者div。将基于大块嵌套的table的layout分解成多个小table,这样就不需要等到整个页面(或大table)内容全部加载完才显示。

9.?指定图像和table的大小:

a. 如果浏览器可以立即决定图像或table的大小,那么它就可以马上显示页面而不要重新做一些布局安排的工作。

b. 这不仅加快了页面的显示,也预防了页面完成加载后布局的一些不当的改变。

c. image使用height和width。

?

附(转载):Javascript 异步加载详解

本文总结一下浏览器在 javascript 的加载方式。关键词:异步加载(async loading),延迟加载(lazy loading),延迟执行(lazy execution),async 属性, defer 属性一、同步加载与异步加载的形式1. 同步加载我们平时最常使用的就是这种同步加载形式:
<script src="http://yourdomain.com/script.js"></script> 
同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止了后续的解析,因此停止了后续的文件加载(如图像)、渲染、代码执行。?js?之所以要同步执行,是因为 js 中可能有输出 document 内容、修改dom、重定向等行为,所以默认同步执行才是安全的。以前的一般建议是把<script>放在页面末尾</body>之前,这样尽可能减少这种阻塞行为,而先让页面展示出来。简单说:加载的网络 timeline 是瀑布模型,而异步加载的 timeline 是并发模型。2. 常见异步加载(Script DOM Element)
(function() {     var s = document.createElement('script');     s.type = 'text/javascript';     s.async = true;     s.src = 'http://yourdomain.com/script.js';     var x = document.getElementsByTagName('script')[0];     x.parentNode.insertBefore(s, x); })();

异步加载又叫非阻塞,浏览器在下载执行 js 同时,还会继续进行后续页面的处理。这种方法是在页面中<script>标签内,用 js 创建一个 script 元素并插入到 document 中。这样就做到了非阻塞的下载 js 代码。async属性是HTML5中新增的异步支持,见后文解释,加上好(不加也不影响)。此方法被称为?Script DOM Element 法,不要求 js 同源。将js代码包裹在匿名函数中并立即执行的方式是为了保护变量名泄露到外部可见,这是很常见的方式,尤其是在 js 库中被普遍使用。例如 Google Analytics 和?Google+?Badge 都使用了这种异步加载代码:
(function() {     var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;     ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';     var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); 
(function()
    {var po = document.createElement("script");    po.type = "text/javascript"; po.async = true;po.src = "https://apis.google.com/js/plusone.js";    var s = document.getElementsByTagName("script")[0];    s.parentNode.insertBefore(po, s); })(); 
但是,这种加载方式在加载执行完之前会阻止 onload 事件的触发,而现在很多页面的代码都在 onload 时还要执行额外的渲染工作等,所以还是会阻塞部分页面的初始化处理。
3. onload 时的异步加载
(function() {     function async_load(){         var s = document.createElement('script');         s.type = 'text/javascript';         s.async = true;         s.src = 'http://yourdomain.com/script.js';         var x = document.getElementsByTagName('script')[0];         x.parentNode.insertBefore(s, x);     }     if (window.attachEvent)         window.attachEvent('onload', async_load);     else         window.addEventListener('load', async_load, false); })(); 
这和前面的方式差不多,但关键是它不是立即开始异步加载 js ,而是在 onload 时才开始异步加载。这样就解决了阻塞 onload 事件触发的问题。补充:DOMContentLoaded 与?OnLoad 事件DOMContentLoaded : 页面(document)已经解析完成,页面中的dom元素已经可用。但是页面中引用的图片、subframe可能还没有加载完。OnLoad:页面的所有资源都加载完毕(包括图片)。浏览器的载入进度在这时才停止。这两个时间点将页面加载的timeline分成了三个阶段。4.异步加载的其它方法由于Javascript的动态特性,还有很多异步加载方法:
读书人网 >Web前端

热点推荐