1. 浏览器核心的两个组成部分

渲染引擎

将网页代码渲染为用户视觉可以感知的平面文档

  • 分类:
  • Firefox        Gecko 引擎
  • Safari        WebKit 引擎
  • Chrome        Blink 引擎
  • IE        Trident 引擎
  • Edge        EdgeHTML 引擎
  • 渲染引擎处理网页,通常分成四个阶段

1. 解析代码:HTML 代码解析为 DOM,CSS 代码解析为 CSSOM(CSS Object Model)。
2. 对象合成:将 DOM 和 CSSOM 合成一棵渲染树(render tree)。
3. 布局:计算出渲染树的布局(layout)。   
4. 绘制:将 渲染树 绘制到屏幕

往往第一步还没完成,第二步和第三步就已经开始了。

所以,会看到这种情况:网页的 HTML 代码还没下载完,但浏览器已经显示出内容了

  • 渲染树转换为网页布局,称为“布局流”(flow)
  • 布局显示到页面的这个过程,称为“绘制”(paint)

重流 和 重绘并不一定一起发生,

重流必然导致重绘,重绘不一定需要重流。

比如

  • 改变元素颜色,只会导致重绘,而不会导致重流;
  • 改变元素的布局,则会导致重绘和重流
  • 作为开发者,应该尽量设法降低重绘的次数和成本

比如,重绘 table 布局 和 flex 布局,开销都会比较大

尽量不要变动高层的 DOM 元素

不要一项一项地改变样式,而是使用 CSS class 一次性改变样式

JavaScript 引擎

主要作用是,读取网页中的 JavaScript 代码,对其处理后运行

  • 解释型语言,也就是说,它不需要编译,由解释器实时运行

缺点: 是每次运行都要调用解释器,系统开销较大,运行速度慢于编译型语言

早期解决:

进行一定程度的编译,生成类似字节码(bytecode)的中间代码,以提高运行速度

逐行解释将字节码转为机器码,还是很低效的

  • 读取代码,进行词法分析(Lexical analysis),将代码分解成词元(token)。
  • 对词元进行语法分析(parsing),将代码整理成“语法树”(syntax tree)。
  • 使用“翻译器”(translator),将代码转为字节码(bytecode)。
  • 使用“字节码解释器”(bytecode interpreter),将字节码转为机器码。

如今:

采用“即时编译”(Just In Time compiler,缩写 JIT)

即字节码只在运行时编译,用到哪一行就编译哪一行,并且把编译结果缓存(inline cache)。

通常,一个程序被经常用到的,只是其中一小部分代码,有了缓存的编译结果,整个程序的运行速度就会显著提升

  • 字节码不能直接运行,而是运行在一个虚拟机(Virtual Machine)之上,一般也把虚拟机称为 JavaScript 引擎
  • 并非所有的 JavaScript 虚拟机运行时都有字节码

有的 JavaScript 虚拟机基于源码,即只要有可能,就通过 JIT(just in time

编译器直接把源码编译成机器码运行,省略字节码步骤。

  • 常见 JavaScript 虚拟机
  • [Chakra](http://en.wikipedia.org/wiki/Chakra_(JScript_engine))(Microsoft Internet Explorer)
  • Nitro/JavaScript Core (Safari)
  • Carakan (Opera)
  • SpiderMonkey (Firefox)
  • [V8](http://en.wikipedia.org/wiki/V8_(JavaScript_engine)) (Chrome, Chromium)

2. 一般的网页加载流程

  • 浏览器一边下载 HTML 网页,一边开始解析。也就是说,不等到下载完,就开始解析。
  • 解析过程中,浏览器发现 <script> 元素,就暂停解析,把网页渲染的控制权转交给 JavaScript 引擎。

原因是 JavaScript 代码可以修改 DOM,所以必须把控制权让给它,否则会导致复杂的线程竞赛的问题。

如果外部脚本加载时间很长(一直无法完成下载),那么浏览器就会一直等待脚本下载完成,造成网页长时间失去响应,浏览器就会呈现“假死”状态,这被称为“阻塞效应”。

  • 如果 <script> 元素引用了外部脚本,就下载该脚本再执行,否则就直接执行代码。
  • JavaScript 引擎执行完毕,控制权交还渲染引擎,恢复往下解析 HTML 网页

此外,对于来自同一个域名的资源,比如脚本文件、样式表文件、图片文件等,浏览器一般有限制,同时最多下载6~20个资源

即最多同时打开的 TCP 连接有限制,这是为了防止对服务器造成太大压力

如果是来自不同域名的资源,就没有这个限制。所以,通常把 静态文件 放在 不同的域名之下,以加快下载速度

2. 解决“阻塞效应” ,而 defer、async 关键字的 <script>,都不应该使用 document.write
<script src="a.js" defer></script>
<script src="b.js" defer></script>

defer 属性 的运行流程如下:

浏览器开始解析 HTML 网页。
解析过程中,发现带有 defer 属性的 <script> 元素。
浏览器继续往下解析 HTML 网页,同时并行下载 <script> 元素加载的外部脚本。
浏览器完成解析 HTML 网页,此时再回过头执行已经下载完成的脚本。

优点:

有了defer属性,浏览器下载脚本文件的时候,不会阻塞页面渲染。

下载的脚本文件在 DOMContentLoaded 事件触发前执行(即刚刚读取完</html>标签),

而且可以保证执行顺序就是它们在页面上出现的顺序

<script src="a.js" async></script>
<script src="b.js" async></script>

使用另一个进程下载脚本,下载时不会阻塞渲染

浏览器开始解析 HTML 网页。
解析过程中,发现带有 async 属性的 script 标签。
浏览器继续往下解析 HTML 网页,同时并行下载 <script> 标签中的外部脚本。
脚本下载完成,浏览器暂停解析 HTML 网页,开始执行下载的脚本。
脚本执行完毕,浏览器恢复解析 HTML 网页。

一旦采用这个属性,就无法保证脚本的执行顺序。

哪个脚本先下载结束,就先执行那个脚本

BOM 浏览器对象模型_渲染引擎_JavaScript 引擎_网页加载流程的更多相关文章

  1. 第一百一十一节,JavaScript,BOM浏览器对象模型

    JavaScript,BOM浏览器对象模型 学习要点: 1.window对象 2.location对象 3.history对象 BOM也叫浏览器对象模型,它提供了很多对象,用于访问浏览器的功能.BOM ...

  2. JavaScript——BOM(浏览器对象模型),时间间隔和暂停

    BOM(浏览器对象模型):能够对浏览器的窗体进行訪问和操作 1.主要的BOM体系: window------------document-------------------------------- ...

  3. BOM 浏览器对象模型_window 对象的常见 window.属性_window.方法

    1. 常用属性 window.devicePixelRatio        像素比 = css / 物理像素 window.scrollX,window.scrollY    滚动条 卷曲距离 if ...

  4. 通过chrome浏览器分析网页加载时间

    今天趁着下班的时间看了下chrome浏览器的网页加载时间分析工具和相关文档,简单写点儿东西记录一下. 以百度首页加载为例,分析下一张图片1.jgp(就是背景图)的加载时间 看右侧的Timing标签,从 ...

  5. BOM 浏览器对象模型_同源限制

    “同源政策”(same-origin policy) 浏览器安全的基石 协议相同 域名相同 端口相同 1995年,同源政策由 Netscape 公司引入浏览器.目前,所有浏览器都实行这个政策 A 网页 ...

  6. BOM 浏览器对象模型_当前窗口的浏览历史 history 对象

    当前窗口的浏览历史 window.history 对象 保存了当前窗口访问过的所有页面网址 由于安全原因,浏览器不允许脚本读取这些地址,但是允许在地址之间导航 history.back() 相当于 h ...

  7. BOM——浏览器对象模型(Browser Object Model)

    什么是BOM? BOM是Browser Object Model的缩写,简称浏览器对象模型 BOM提供了独立于内容而与浏览器窗口进行交互的对象 由于BOM主要用于管理窗口与窗口之间的通讯,因此其核心对 ...

  8. BOM浏览器对象模型

    访问和操作浏览器窗口的模型称为浏览器对象模型BOM(Browser Object Model). BOM整体对象图. 核心是window对象: 以下有特殊双重身份: window对象既是ECMAScr ...

  9. javascript之BOM浏览器对象模型引入

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

随机推荐

  1. [Android] Android 锁屏实现与总结 (一)

    实现锁屏的方式有多种(锁屏应用.悬浮窗.普通Activity伪造锁屏等等).但国内比较主流并且被广泛应用的Activity伪造锁屏方式. 实例演示图片如下: 系列文章链接如下: [Android] A ...

  2. table 表格固定表头和第一列、内容可滚动

    整理了下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...

  3. 老是上不了 google scholar...

    这段时间老是上不了 google scholar... 下载了最新的 host 也不行. 难道真是电脑有问题了? 网络有时也老是掉... 也好. 多休息休息. 人生难得几回清闲. 马上就要开学咯. 课 ...

  4. luogu 4345 Lucas的变形应用

    求 sigma i由0-k C(n,i) 利用Lucas定理+整除分块将C(n/p,i/p)利用i/p分块,得到k/p-1个整块(p-1)和一个小块(k%p) 最后得到式子 F(n,k)=F(n/p, ...

  5. linux 只查看目录下文件夹

    只显示目录文件夹 ls -F |grep "/$" 显示 目录权限 ls -al |grep "^d" 只显示文件 ls -al |grep "^-& ...

  6. django drf 开发 ~ models基础学习

    零 介绍  对于ORM框架,可以简单的认为自定义类U表示数据库的表:根据类创建的对象表示数据库表一 数据表设计  1 类型统计     CharField->(string)->(1 ma ...

  7. 残差网络ResNet笔记

    发现博客园也可以支持Markdown,就把我之前写的博客搬过来了- 欢迎转载,请注明出处:http://www.cnblogs.com/alanma/p/6877166.html 下面是正文: Dee ...

  8. LeetCode第十一题-可以装最多水的容器

    Container With Most Water 问题简介:通过一个给定数组,找出最大的矩形面积 问题详解:给定一个数组,包含n个非负整数a1,a2,…,an,其中每个表示坐标(i,ai)处的点,绘 ...

  9. 2018-2019-1 20189208《Linux内核原理与分析》第九周作业

    活动 main函数编译有问题,div 函数和系统中某个函数重名,浮点输出有问题,scanf也有问题 修改如下 scanf_s("%d %d", &a, &b); p ...

  10. CKEditor5 + vue2.0 自定义图片上传、highlight、字体等用法

    因业务需求,要在 vue2.0 的项目里使用富文本编辑器,经过调研多个编辑器,CKEditor5 支持 vue,遂采用.因 CKEditor5 文档比较少,此处记录下引用和一些基本用法. CKEdit ...