browser-render

4/30

Chromium 和 Chrome 的区别

参考:

https://blog.csdn.net/sunboy_2050/article/details/94331691

https://juejin.im/post/5e3630a8518825267f69a780

扩展:

https://juejin.im/post/5c0492a36fb9a049e82b435a

https://zhuanlan.zhihu.com/p/48074353

Chromium

Chromium 官网:https://www.chromium.org

Chromium 源码:https://github.com/chromium/chromium

Chromium 是谷歌的开源项目,由开源社区维护,拥有诸多尖端优势。

拥有众多的版本包括 Windows、Mac、Linux,几乎每天都在进行更新,版本不稳定。

国产的所有 “双核浏览器”,都是基于 Chromium 开发的,甚至 Chrome 也是基于它。

我们下载的 Chromium 浏览器都是其源码未经修改的直接编译版本。

Chrome

Chrome 官网:https://www.google.com/chrome/

Chrome 基于 Chromium,但是最重要的一点是它是闭源的,跨平台多端支持。

所以有这样的一种说法:谷歌把核心技术都保留在了之家的 Chrome 中。

Chrome 是基于 Chromium 的,但谷歌在 Chromium 浏览器中添加了 Chromium 所缺少的一些专有的、封闭源代码位。具体来说,Google 采用了 Chromium,然后添加了以下内容:

你应该注意到,虽然它不是谷歌品牌,但 Chromium 仍然是以谷歌为中心的。例如,Chromium 包含与 Chrome 相同的同步功能,您可以使用 Google 帐户登录并同步数据。

浏览器引擎

Mozilla 的 Firefox 是第一个试图淘汰微软公司几乎要被废弃的浏览器的主要竞争对手。与 Firefox 一道的,还有包括使用 WebKit 引擎的 Safari 浏览器(隶属于苹果公司)、先使用 Presto 引擎后使用 Blink 引擎的 Opera 浏览器(隶属于 Opera 公司)、最后是先使用 WebKit 引擎后使用 Blink 引擎的 Chrome 浏览器(隶属于 Google 公司)。

所有这些浏览器引擎不仅负责管理网页的布局,同时还包括一个 JavaScript 引擎、用于解释和编译 JavaScript 代码。在这些 JavaScript 引擎中,最受欢迎的是 V8,V8 不是仅被用在了 Chrome 浏览器中。

由 GitHub 开发和维护的用于创建跨平台桌面程序的 Electron,底层就是由 V8 引擎驱动的。

不仅如此,Node.js 运行时系统也是由 V8 引擎驱动的。这使得 Node.js 可以不断受益于 V8 的开发和改进,并提供出色而快速的服务器体验。由于 V8 是用 C++ 编写的,因此能够将 JavaScript 编译为本地机器代码,而不是实时解释它,这使的 Node.js 在服务器市场中如此快速的占据一定的竞争力。

三个主要的浏览器引擎

现在,微软基于 Chromium 开发的新版 Edge 浏览器已经发布 ,包括 Opera 在内的其他浏览器厂商也已经进行了转换。当前市场上只有 3 个主要的浏览器引擎:Mozilla 的 Gecko、Google 的 Blink、还有苹果的的 WebKit(Blink 的近亲)。

等等,Blink 是怎么回事?Blink 是 Google Chrome 浏览器的渲染引擎,V8 是 Blink 内置的 JavaScript 引擎。Chromium 是 Google 公司一个开源浏览器项目,使用 Blink 渲染引擎驱动。Chromium 和 Google Chrome 的关系,可以理解为:Chromium + 集成 Google 产品 = Google Chrome。

译注:可以理解为 Google Chrome 是个商业项目,而 Chromium 是一个中立、无立场的(理论上)的开源项目。

V8 对 DOM(文档对象模型)一无所知,因为它仅用于处理 JavaScript。Blink 内置的布局引擎负责处理网页布局和展示。因为 Node.js 不需要使用 DOM,所以 Node.js 只使用了 V8 引擎,而没有把整个 Blink 引擎都搬过来用。

三个主要的 JavaScript 引擎

3 个主要的浏览器引擎下,是 3 个不同的 JavaScript 引擎。也就是说现在市场上只有 3 个主要的 JavaScript 引擎。Chromium 市场份占据 65%,再加上从 Edge 和 Internet Explorer 吸收的大约 15% 的市场份额,后面还会继续扩大。当前,Web 开发人员正在最流行的浏览器引擎上构建能够发挥最佳性能的网站。但是 Chromium 最后有没有可能重蹈 Internet Explorer 6 的覆辙呢?不过还是希望 Chromium 仍能继续跟进标准的步子,并且随着来自 Firefox 和 Safari 的竞争,相信未来的发展也会更加明朗和积极。希望 Google 不会减慢 Chromium 的开发速度,并在如此高的市场份额下继续保持竞争力。

下面做一个总结:

1_VqHSZhJ93Vhijkm_VCjHsw.gif

简介

浏览器的主要功能

浏览器的高层结构

浏览器的主要组件为:

  1. 用户界面 - 包括地址栏、前进/后退按钮、书签菜单等。除了浏览器主窗口显示的您请求的页面外,其他显示的各个部分都属于用户界面。

  2. 浏览器引擎 - 在用户界面和呈现引擎之间传送指令。

  3. 呈现引擎 - 负责显示请求的内容。如果请求的内容是 HTML,它就负责解析 HTML 和 CSS 内容,并将解析后的内容显示在屏幕上。

  4. 网络 - 用于网络调用,比如 HTTP 请求。其接口与平台无关,并为所有平台提供底层实现。

  5. 用户界面后端 - 用于绘制基本的窗口小部件,比如组合框和窗口。其公开了与平台无关的通用接口,而在底层使用操作系统的用户界面方法。

  6. JavaScript 解释器。用于解析和执行 JavaScript 代码。

  7. 数据存储。这是持久层。浏览器需要在硬盘上保存各种数据,例如 Cookie。新的 HTML 规范 (HTML5) 定义了“网络数据库”,这是一个完整(但是轻便)的浏览器内数据库。

    img

    ***:浏览器的主要组件。***

呈现引擎

呈现引擎

主流程

主流程示例

解析和 DOM 树构建

解析 - 综述

语法

解析器和词法分析器的组合

翻译

解析示例

词汇和语法的正式定义

解析器类型

自动生成解析器

HTML 解析器

HTML 语法定义

非与上下文无关的语法

HTML DTD

DOM

解析算法

标记化算法

树构建算法

解析结束后的操作

浏览器的容错机制

让我们看一些 WebKit 容错的示例:

使用了 </br> 而不是 <br>

离散表格

嵌套的表单元素

过于复杂的标记层次结构

放错位置的 Html 或者 Body 结束标记

CSS 解析

WebKit CSS 解析器

处理脚本和样式表的顺序

参考

dom 解析过程

总结

阻塞型

内联 css

内联 javascript

外联普通 javascript

外联 defer javascript

javascript 标签之前的外联 css

非阻塞型

外联脚本加载过程

预解析

DOMContentLoaded 兼容性问题

阻塞型优化

 <link href="index.css" rel="stylesheet">
 <link href="print.css" rel="stylesheet" media="print">
 <link href="other.css" rel="stylesheet" media="(min-width: 30em) and (orientation: landscape)">

*document.createElement

*document.write 与 innerHTML

呈现树构建

  RenderObject* RenderObject::createObject(Node* node, RenderStyle* style)
  {
      Document* doc = node->document();
      RenderArena* arena = doc->renderArena();
      ...
      RenderObject* o = 0;
  
      switch (style->display()) {
          case NONE:
              break;
          case INLINE:
              o = new (arena) RenderInline(node);
              break;
          case BLOCK:
              o = new (arena) RenderBlock(node);
              break;
          case INLINE_BLOCK:
              o = new (arena) RenderBlock(node);
              break;
          case LIST_ITEM:
              o = new (arena) RenderListItem(node);
              break;
         ...
      }
  
      return o;
  }

呈现树和 DOM 树的关系

构建呈现树的流程

样式计算

共享样式数据

  1. 这些元素必须处于相同的鼠标状态(例如,不允许其中一个是“:hover”状态,而另一个不是)
  2. 任何元素都没有 ID
  3. 标记名称应匹配
  4. 类属性应匹配
  5. 映射属性的集合必须是完全相同的
  6. 链接状态必须匹配
  7. 焦点状态必须匹配
  8. 任何元素都不应受属性选择器的影响,这里所说的“影响”是指在选择器中的任何位置有任何使用了属性选择器的选择器匹配
  9. 元素中不能有任何 inline 样式属性
  10. 不能使用任何同级选择器。WebCore 在遇到任何同级选择器时,只会引发一个全局开关,并停用整个文档的样式共享(如果存在)。这包括 + 选择器以及 :first-child 和 :last-child 等选择器。

Firefox 规则树

结构划分

使用规则树计算样式上下文

对规则进行处理以简化匹配

样式规则有一些来源:

我们以如下的样式规则为例:

以正确的层叠顺序应用规则

样式表层叠顺序

特异性

规则排序

渐进式处理

布局

Dirty 位系统

全局布局和增量布局

异步布局和同步布局

优化

布局处理

宽度计算

换行

绘制

全局绘制和增量绘制

绘制顺序

Firefox 显示列表

WebKit 矩形存储

动态变化

呈现引擎的线程

事件循环

CSS2 可视化模型

画布

分层展示

https://www.html5rocks.com/zh/tutorials/internals/howbrowserswork/#Computing_the_style_contexts_using_the_rule_tree

JS 解析引擎

BNF 语法

相关面试题

语法解析

中缀表达式

后缀表达式