web页面展示的部分过程

来源:互联网 发布:fm自建球员数据锁定 编辑:程序博客网 时间:2024/05/21 12:11

       有些地方觉得不对,是因为自己水平有限,希望留言。供大家一起学习。(我对v8就不了解)。

      浏览器分为shell+内核。浏览器是多线程的。内核里面包括渲染引擎和js引擎等。浏览器中常用的5个线程:GUI渲染线程,2.js引擎线程,3.定时器线程,4.事件触发线程,5.http异步请求线程。

     渲染引擎首先通过网络获得所请求的文档的内容,通常以8k完成。

                                        解析html以构建dom树 -> 构建render树 -> 布局render树 -> 绘制render树

    

     在构建dom树的时候,css的样式解析也在进行。(如果想要只知道原理,可以看V8,这个我不懂)。

     浏览器是一边解析一边渲染的过程。是一种“自上而下”的形式。这里面涉及回流和重绘。

    js的解析时有js引擎完成的。js是单线程运行。比如存在IO读写等,需要耗时比较多,所有需要一种机制可以先执行排在后面的任务,这就是:同步任务(synchronous)和异步任务(asynchronous)。JS的执行机制就可以看做是一个主线程加上一个任务队列(task queue)。同步任务就是放在主线程上执行的任务,异步任务是放在任务队列中的任务。所有的同步任务在主线程上执行,形成一个执行栈;异步任务有了运行结果就会在任务队列中放置一个事件;脚本运行时先依次运行执行栈,然后会从任务队列里提取事件,运行任务队列中的任务,这个过程是不断重复的,所以又叫做事件循环(Event loop)。

     浏览器在解析过程中,如果遇到请求外部资源时,如图像,iconfont,JS等。请求过程是异步的,并不会影响HTML文档进行加载,但是当文档加载过程中遇到JS文件,HTML文档会挂起渲染过程,不仅要等到文档中JS文件加载完毕还要等待解析执行完毕,才会继续HTML的渲染过程。原因是因为JS有可能修改DOM结构,这就意味着JS执行完成前,后续所有资源的下载是没有必要的,这就是JS阻塞后续资源下载的根本原因。CSS文件的加载不影响JS文件的加载,但是却影响JS文件的执行。JS代码执行前浏览器必须保证CSS文件已经下载并加载完毕。

  但我们在头部写js文件的时候,我们最好不要在头部的js中获取dom节点元素。因为没有dom树没有构建完成,故获取的为空。渲染引擎和js在操作dom树的调用V8(以v8为例)。当我们用js操作dom树,不一定能马上显示在页面上,是因为JS线程可以阻塞其他的4个线程。


0 0