浏览器工作原理

秃头王路飞
• 阅读 746

浏览器渲染过程

浏览器渲染

  1. 解析 HTML 文件,构建 DOM 树,同时浏览器主进程负责下载 CSS 文件

  2. CSS 文件下载完成,解析 CSS 文件成树形的数据结构,然后结合 DOM 树合并成 RenderObject 树

  3. 布局 RenderObject 树 (Layout/reflow),负责 RenderObject 树中的元素的尺寸,位置等计算

  4. 绘制 RenderObject 树 (paint),绘制页面的像素信息

  5. 浏览器主进程将默认的图层和复合图层交给 GPU 进程,GPU 进程再将各个图层合成(composite),最后显示出页面

    总结:css不会阻止DOM的解析,但是会阻止render树的构成

V8执行流程

须知:JS是运行在V8引擎(Chrome等)上

  1. JS通过Parse模块解析成AST树,AST会被Ignition转成ByteCode,并且解释执行
  2. 如果一个函数被多次调用,那么就会被标记为热点函数,那么就会经过TurboFan转换成优化的机器码,提高代码的执行性能
  3. 但是,机器码实际上也会被还原为ByteCode,这是因为如果后续执行函数的过程中,类型发生了变化(比如sum函数原来执行的是number类型,后来执行变成了string类型),之前优化的机器码并不能正确的处理运算,就会逆向的转换成字节码,再由Ignition

V8执行JS细节

parse过程

  1. Blink会将源码交给V8引擎,Stream获取到源码并且进行编码转换
  2. Scanner会进行词法分析(lexical analysis),词法分析会将代码转换成tokens
  3. 接下来tokens会被转换成AST树,经过Parser和PreParser:
    • Parser就是直接将tokens转成AST树架构
    • PreParser称之为预解析,为什么需要预解析呢? [1] 这是因为并不是所有的JavaScript代码,在一开始时就会被执行。那么对所有的JavaScript代码进行解析,必然会影响网页的运行效率 [2] 所以V8引擎就实现了Lazy Parsing(延迟解析)的方案,它的作用是将不必要的函数进行预解析,也就是只解析暂时需要的内容,而对函数的全量解析是在函数被调用时才会进行; [3]比如我们在一个函数outer内部定义了另外一个函数inner,那么inner函数就会进行预解析
  4. 生成AST树后,会被Ignition转成字节码(bytecode),之后的过程就是代码的执行过程(后续会详细分析)

JavaScript的执行过程

名词解释:

  1. 执行上下文栈(Execution Context Stack,简称ECS)
  2. Global Execution Context(GEC)
  3. 函数执行上下文(Functional Execution Context,简称FEC)
  4. Activation Object(AO)

GEC被放入到ECS中里面包含两部分内容

  1. 在代码执行前,在parser转成AST的过程中,会将全局定义的变量、函数等加入到GlobalObject中,但是并不会赋值(这个过程也称之为变量的作用域提升(hoisting))
  2. 在代码执行中,对变量赋值,或者执行其他的函数

FEC中包含三部分内容

  1. 在解析函数成为AST树结构时,会创建一个Activation Object(AO):AO中包含形参、arguments、函数定义和指向函数对象、定义的变量
  2. 作用域链:由VO(在函数中就是AO对象)和父级VO组成,查找时会一层层查找
  3. this绑定的值:这个我们后续会详细解析
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
不才 不才
3年前
从输入URL到页面渲染完成
从输入URL到页面渲染完成涉及网络、浏览器工作原理等知识。前序知识浏览器进程结构textBrowser进程负责协调、主控,包括地址栏、书签、历史栈。GPU进程负责整个浏览器界面的渲染网络进程负责发起接收网络请求插件进程控制网页中使用到的插件如flash渲染器进程默认使用(Processpersiteinstance)模式四种
亚瑟 亚瑟
3年前
React之集成测试 – 测试概览
你可以用像测试其他JavaScript代码类似的方式测试React组件。现在有许多种测试React组件的方法。大体上可以被分为两类:渲染组件树在一个简化的测试环境中渲染组件树并对它们的输出做断言检查。运行完整应用在一个真实的浏览器环境中运行整个应用(也被称为“端到端(endtoend)”测试)。本章节主要专
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
浩浩 浩浩
3年前
【Flutter实战】布局类组件简介
4.1布局类组件简介布局类组件都会包含一个或多个子组件,不同的布局类组件对子组件排版(layout)方式不同。我们在前面说过Element树才是最终的绘制树,Element树是通过Widget树来创建的(通过Widget.createElement()),Widget其实就是Element的配置数据。在Flutter中,根据Widget是否
Wesley13 Wesley13
3年前
03. react 初次见面
    与浏览器的DOM元素不同,React当中的元素事实上是普通的对象,ReactDOM可以确保浏览器DOM的数据内容与React元素保持一致。1、将元素渲染到DOM中    首先我们在一个HTML页面中添加一个id"root" 的<div:<divid"root"
Stella981 Stella981
3年前
React的虚拟DOM
上一篇文章中,DOM树的信息可以用JavaScript对象来表示,反过来,可以根据这个用JavaScript对象表示的树结构来真正构建一颗DOM树。用JavaScript对象表示DOM信息和结构,当状态变更的时候,重新渲染这个JavaScript的对象结构,当然这样做,其实并没有更新到真正的页面上。但是可以用新渲染的对象树和旧的树进行对比,记录这两棵树
Wesley13 Wesley13
3年前
MySQL面试(二)
1、为什么索引遵循最左匹配原则?  当B树的数据项是符合的数据结构,比如(name,age,sex)的时候,B树是按照从左到右的顺序建立搜索树的。比如当(张三,20,F)这样的数据来检索的时候,b树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候
Stella981 Stella981
3年前
H5游戏性能优化整理(cocos
近期在一家公司负责H5游戏加载速度优化,这里把近期做的项目优化项做一个整理分享:(若文中有错误的地方,还请指出。)   分享流程:了解html渲染流程html相关优化http相关优化项目结构和游戏流程及优化游戏渲染相关优化代码编写优化html渲染流程HTML解析过程:构建DOM树、构
Stella981 Stella981
3年前
C语言实现的基于Huffman哈夫曼编码的数据压缩与解压缩
实验目的了解文件的概念掌握线性链表的插入、删除等算法掌握Huffman树的概念及构造方法掌握二叉树的存储结构及遍历算法利用Huffman树及Huffman编码,掌握实现文件压缩的一般原理参考博文和源码下载地址:https://writebug.com/article/1281.html(https://www