一:为何要了解浏览器渲染页面和加载页面机制,主要仍是性能的优化。javascript
这三个过程在实际进行的时候又不是彻底独立,而是会有交叉。会形成一边加载,一边解析,一边渲染的工做现象。css
二:用户访问网页都发生了什么。html
1~4步骤HTTP协议的一些内容,访问服务器端可能遭遇的问题:若是网络服务器没法获取数据库服务器返回的资源文件(http response 404),或者因为并发缘由暂时没法处理用户的http请求(http response 500)。java
三:浏览器渲染页面和解析加载页面机制。数据库
a.加载,即为获取资源文件的过程,不一样浏览器,以及他们的不一样版本在实现这一过程时,会有不一样的实现效果(资源间互相阻塞,能够用timeline来作测试)。这里先说下浏览器的5个常驻线程:浏览器
备注:现代浏览器存在 prefetch 优化,浏览器会另外开启线程,提早下载js、css文件,须要注意的是,预加载js并不会改变dom结构,他将这个工做留给主加载。服务器
注意:这里也涉及到 阻塞 的现象,当js引擎线程(第二个)进行时,会挂起其余一切线程,这个时候三、四、5这三类线程也会产生不一样的异步事件,因为 javascript引擎线程为单线程,因此代码都是先压到队列,采用先进先出的方式运行,事件处理函数,timer函数也会压在队列中,不断的从队头取出事件,这就叫:javascript-event-loop。简单点说应该是当在进行第二线程的时候,1,3,4,5都会挂起,好比这时候触发click事件,即便先前JS已经加载完成,click事件会压在队列里,这里也要先完成第二线程才会执行click事件。网络
加载顺序:并发
缘由:JS有可能会修改DOM,最为经典的document.write,这意味着,在JS执行完成前,后续全部资源的下载多是没有必要的,这是js阻塞后续资源下载的根本缘由。
办法:能够将外部引用的js文件放在</body>前。dom
4. css可能影响js的执行形成阻塞。
缘由:如js里面var width = $('#id').width();这里js执行前,浏览器必须保证以前的css文件已下载和解析完成(后面的不会影响),这也是css阻塞后续js的根本缘由。当js文件不须要依赖css文件时,能够将js文件放在头部css的前面。
5. 预加载网页,利用空余时间来提早加载该网页的后续网页。
<link rel="prefetch" href="http://">
6. 为js脚本添加defer属性,其不会阻塞后续DOM的的渲染。可是由于这个defer只是IE专用,因此通常用得比较少。而咱们标准的的HTML5也加入了一个异步载入javascript的属性:async,不管你对它赋什么样的值,只要它出现,它就开始异步加载js文件。可是, async的异步加载会有一个比较严重的问题,那就是它忠实地践行着“载入后立刻执行”这条军规,因此,虽然它并不阻塞页面的渲染,可是你也没法控制他执行的次序和时机。
<script defer="true" src="JavaScript.js" type="text/javascript"/>
mark--zhq[2]。