前端进阶(一)浏览器运行原理

最近随着项目经验的增加,打算写一个前端工程师进阶的系列,一是作为自己前端开发经验的总结;二是想把经验分享给刚入门前端,重复写了大量的前端代码,但是没有提升的同学,让我们一起成长为真正的前端开发工程师。

刚开始关注浏览器运行原来大概是刚接触前端时,项目组让我解决一些页面的兼容性问题,当时认真研究了浏览器的运行原理,并对组内的同事做了简单的分享,现在经历过大量项目的洗礼,觉得有必要将这部分内容的精华加以提炼,作为前端进阶的第一篇文章。

(一)浏览器

浏览器是指可以显示网页服务器或者文件系统的HTML文件(标准通用标记语言的一个应用)内容,并让用户与这些文件交互的一种软件。

浏览器的主要功能就是向服务器发出请求,在浏览器窗口中展示您选择的网络资源。这里所说的资源一般是指 HTML 文档,也可以是 PDF、 图片或其他的类型。 资源的位置由用户使用URI(统一资源标符)指定。多年以来,各浏览器都没有完全遵从这些规范,同时还在开发自己独有的扩展程序,这给网络开发人员带来了严重的兼容性问题。 如今,大多数的浏览器都是或多或少地遵从规范。

目前使用的主流浏览器有五个:Internet Explorer、 Firefox、 Safari、 Chrome 和 Opera。

1. 浏览器按照引擎分类
Trident引擎:Internet Explorer
Webkit引擎:Chrome(28版本后基于blink,blink是webkit的一个分支)和Safari
Gecko引擎:Firefox

Presto引擎:早期Opera采用,后用webkit引擎

(二)浏览器的主要组件

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

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

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

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

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

(6) JavaScript 解释器 - 用于解析和执行 JavaScript 代码。

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

浏览器组成部分如图1-1所示。

图1-1 浏览器组成部分

(三)浏览器内核工作原理简介

3.1渲染引擎

渲染引擎在浏览器窗口中显示所请求的内容,浏览器内核分成两部分:渲染引擎和js引擎,由于js引擎越来越独立,内核就倾向于只指渲染引擎,所以渲染引擎也称为浏览器内核。渲染引擎一开始会从网络层获取请求文档的内容,通常以8K分块的方式完成。 获取了文档内容之后,渲染引擎开始正式工作,其基本流程如图所示:

图1-2 渲染引擎工作原理

渲染引擎解析HTML文档,并将文档中的标签转化为DOM节点树,即” 内容树” 。 同时,它也会解析外部CSS文件以及style标签中的样式数据。 这些样式信息连同HTML中的” 可见内容” 一道,被用于构建另一棵树——” 渲染树(Render树)” 。 渲染树构建完毕之后,将会进入” 布局” 处理阶段,即为每一个节点分配一个屏幕坐标。 再下一步就是绘制(painting),即遍历render树,并使用UI后端层绘制每个节点。

注意:这个过程是逐步完成的,为了更好的用户体验,渲染引擎将会尽可能早的将内容呈现到屏幕上,并不会等到所有的html都解析完成之后再去构建和布局渲染树。 它是解析完一部分内容就显示一部分内容,同时,可能还在通过网络下载其余内容。

DOM:文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口。 在网页上,组织页面(或文档)的对象被组织在一个树形结构中,用来表示文档中对象的标准模型就称为DOM。
渲染引擎解析:
解析一个文档即将其转换为具有一定意义的结构——编码可以理解和使用的东西。 解析的结果通常是表达文档结构的节点树,称为解析树或语法树。
3.1.1 解析
3.1.1.1 与上下文无关的语法
所有可以解析的格式都对应确定的语法(由词汇和语法规则构成),这称为
与上下文无关的语法。 这里先说要说明的是:CSS、 JavaScript是与上下文无关的语法,而HTML不是与上下文无关的语法。
3.1.1.2 解析器

解析的过程可以分成两个子过程:词法分析和语法分析

1、词法分析是将输入内容分割成大量标记的过程。 标记是语言中的词汇,即构成内容的单位。

2、语法分析是应用语言的语法规则的过程。

解析通常是一个迭代的过程。 通常,解析器会向词法分析器请求一个新标记,并尝试将其与某条语法规则进行匹配。 如果发现了匹配规则,解析器会将一个对应于该标记的节点添加到解析树中,然后继续请求下一个标记。 如果没有规则可以匹配,解析器就会将标记存储到内部,并继续请求标记,直至找到可与所有内部存储的标记匹配的规则。 如果找不到任何匹配规则,解析器就会引发一个异常。 这意味着文档无效,包含语法错误。

3.1.2 HTML解析
HTML 解析器的任务是将 HTML 标记解析成解析树。 HTML 的词汇和语法在 W3C 组织创建的规范中进行了定义,html不能简单的用解析所需的上下文无关文法来定义。

浏览器为html定制了专属的解析器。 Html5规范中描述了这个解析算法,算法包括两个阶段——符号化和构建树,Html解析流程如图1-3所示。

图1-3 Html解析流程图

符号化是词法分析的过程,将输入解析为符号,html的符号包括开始标签、 结束标签、 属性名及属性值。符号识别器识别出符号后,将其传递给树构建器,并读取下一个字符,以识别下一个符号,这样直到处理完所有输入。

3.1.3 CSS解析
css属于上下文无关文法,可以用前面所描述的解析器来解析。 Css规范定义了css的词法及语法文法。 每个符号都由正则表达式定义了词法(词汇表),语法用BNF(由 John Backus 和 Peter Naur 首先引入的用来描述计算机语言语法的符号集)进行描述。

Webkit使用Flex和Bison解析生成器从CSS语法文件中自动生成解析器。

3.2 JS引擎

JS引擎是一个专门处理JS脚本的虚拟机,专门设计来解释和执行的 JavaScript 代码。 JS引擎会加载你的源代码,把它分解成字符串,把这些字符串转换成编译器可以理解的字节码,然后执行这些字节码。不同浏览器有不同的JS引擎 ,不同浏览器的js引擎如表1-1所示。
表1-1 不同浏览器的js引擎

(四)前端处理流程简介

这个流程大家可以参考网上很多人总结的各个版本的从输入一个url到看到页面,发生了什么过程。在这里我用自己的话简单概括为以下几点(仅供参考,欢迎指正):

1、输入url

2、查看浏览器缓存,看是否有缓存,如果有缓存,继续查看缓存是否过期,如果没有过期,直接返回缓存页面,如果没有缓存或者缓存过期,发送一个请求。

3、浏览器解析url地址,获取协议、主机名、端口号和路径。

4、获取主机ip地址过程

(1)浏览器缓存

(2)主机缓存

(3)hosts文件

(4)路由器缓存

(5)DNS缓存

(6)DNS递归查询

5、浏览器发起和服务器的TCP连接,执行三次握手(略)

6、三次握手连接后,浏览器发送一个http请求(这部分是重点,请查询相关资料,详细了解http协议关于请求格式和重要的几个请求头字段含义)。

7、服务器收到请求,转到相关的服务程序,期间可能需要连接并操作数据库(主要分get和post请求)。

8、服务器看是否需要缓存,服务器处理完请求,发出一个响应(这部分也是重点,请查询资料了解http响应头各个字段的含义)

9、服务器并根据请求头包含信息决定是否需要关闭TCP连接(如需关闭,则需要四次挥手过程)

10、浏览器对接收到的响应进行解码

11、浏览器解析收到的响应并根据响应的内容(假如是HTML文件)进行构建DOM树,构建render树,渲染render树等过程

12、处理嵌入的其他资源如css文件、js文件、图片文件、音视频等文件,处理过程类似上面的步骤在此不详述。

(五)参考资料

1. How Browsers Work: Behind the Scenes of Modern Web Browsers,Tali Garsiel,
http://taligarsiel.com/Projects/howbrowserswork1.htm
2. How Browsers Work中文译文 [浏览器的工作原理:新式网络浏览器幕后揭秘 塔利·加希
]https://www.html5rocks.com/zh/tutorials/internals/howbrowserswork/#The_browsers_
we_will_talk_about
3. http://grosskurth.ca/papers/browser-refarch.pdf
4. http://tools.yesky.com/101/11197101_2.shtml, 各大浏览器 CSS3 和 HTML5 兼容速查表
5.
http://www.cnblogs.com/gdutbean/archive/2012/02/21/2362003.html JS各种引擎介绍


  • 18
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: B站飞哥的《大前端进阶笔记》是一份非常实用的学习资料,旨在帮助学习前端技术的人进一步提高自己的技能。笔记包括了前端基础知识的学习、前端开发中常用的框架、库和工具的介绍,以及一些应用实例的实战演练。其中,最引人注目的是笔记的实战演练部分,涵盖了多个项目的案例,包括电商网站、音乐播放器、博客等,这些实例对于前端开发人员来说非常有用,可以让他们更好地掌握前端开发的核心技能。 这份笔记分为六个部分,包括HTML、CSS、JavaScript、框架、工程化和实战项目。每个部分都包含了该部分的基础知识、实践技巧和高级应用,逐步深入地讲解了前端开发的各个方面。在框架和工具章节,笔记讲解了前端界流行的React、Vue、Webpack等,并提供了实际案例的演示。 总体而言,B站飞哥的《大前端进阶笔记》是一份非常优秀的学习资料,对于新手和有经验的前端开发人员都非常有帮助。笔记内容丰富、条理清晰,讲解方式易于理解,并提供了实际案例的演示,是一份非常有价值的前端学习资源。 ### 回答2: B站是一个以弹幕视频为特色的视频 sharing 社区,拥有海量的优质视频资源。其中,飞哥大前端进阶笔记是一系列大前端学习视频,由 B站菜鸟技术博主飞哥所录制和发布。 飞哥大前端进阶笔记旨在帮助前端工程师提升技术能力和进阶能力,内容丰富全面,涵盖 HTML、CSS、JavaScript、Vue、React 等前端技术知识点。特别是对于 JavaScript 这一难点,飞哥进行了重点讲解和深度剖析,引导观众深入理解和掌握 JavaScript 知识体系。 除此之外,飞哥大前端进阶笔记还分享了前端工程师的实际工作经验和应用方法,讲述了企业级前端工程师的职责和要求,为前端工程师的职业发展做出了有益的引导。 总之,飞哥大前端进阶笔记是一系列非常实用的前端技术学习视频,对于初学者和职业前端工程师都有很好的指导作用。以其深刻的剖析和系统的表述,早已赢得了广大前端同胞的支持与好评。 ### 回答3: b站是一家全球知名的视频网站,用户群体广泛。飞哥是一位在b站上分享编程技巧和经验的UP主,他的视频涵盖了各种常用编程语言和开发工具。此外,飞哥还有一系列关于大前端进阶方面的笔记,为想要深入学习前端开发的用户提供了很大的帮助。 在飞哥的大前端进阶笔记中,他详细介绍了前端技术的基本概念和原理。这些笔记主要涉及HTML、CSS、JavaScript、浏览器工作原理前端框架、前端性能优化等方面。通过这些笔记,用户可以更深入地理解前端技术,从而不断提高自己的技能水平。 此外,飞哥还分享了很多实用的工具和技巧,这些工具和技巧可以极大地提高前端开发的效率。包括VS Code的使用技巧、前端错误调试技巧、前端自动化工具、Webpack等。这些技巧的学习,将使前端开发者更加顺利和高效地完成项目。 总的来说,飞哥的大前端进阶笔记是非常实用和有价值的。无论是前端初学者还是有一定经验的开发者,都可以从中获得很多启迪和帮助。如果你想了解前端技术或者想要在前端开发方面有更多提高,可以去b站上学习飞哥的笔记。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fullstack_lth

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值