博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
衣食父母-浏览器
阅读量:6331 次
发布时间:2019-06-22

本文共 1595 字,大约阅读时间需要 5 分钟。

我觉得文章题目起的挺现实,在BS大行其道的今天,浏览器作为一款window软件已经是很多程序员兄弟的衣食父母,所以了解一下浏览器是很必要的。

1、背景

作为前端程序员一定要好奇从地址栏输入地址后到底发生了什么

主流浏览器

IE、Firefox、Safari、Chrome、Opera五大家族, Firefox、Chrome是开源的完全开源的,safari部分开源

浏览器的主要构成

用户界面、浏览器引擎、渲染引擎、网络、js解释器、UI后端、数据存储,google为每个tab页分一个渲染引擎,

注:
(1) 浏览器引擎是一个主进程、用来管理渲染引擎所在的进程,渲染引擎对应的进程可能只属于一个tab页(chrome),而浏览器进程属于整个浏览器
(2) 渲染引擎没有访问操作系统的权限(文件、网络、设备)而浏览器引擎有,这样的目的是有恶意网站时不会损害整个浏览器或者操作系统
(3) 当用户在地址栏输入网址请求网页时,渲染引擎向浏览器引擎发出请求:依次调用网络获取资源,请求的资源到达后,浏览器引擎把资源传给渲染

渲染引擎,渲染引擎将获取的资源进行解析(html css js),有一些组件(布局进程就属于其中的某个组件)格式化后传给浏览器引擎,浏览器在界面中将界面呈现出来
渲染引擎

渲染引擎有两种Mozilla和webkit,熟悉css的同学可能感觉这俩外国字挺熟悉,对啊css兼容性的属性都会加这俩前缀,渲染引擎就是将请求的资源在浏览器中呈现出来

渲染主流程

首先是获取请求的文档,文档由8kb的数据块构成,。构建成dom树->构建render树->布局render树->绘制render树。

(1) 渲染引擎从浏览器引擎获取html文档后开始解析,进行词法分析(将输入分成可以理解的单词)和语法分析(对应语言的语义规则,描述文档内容),最终根据文档标签构建一棵DOM树(可以理解成c++的一种数据结构),解析过程如果碰到了行内、内联、外联的css,对应的子进程着手cssom树的构建(可以理解成c++的一种数据结构,描述样式规则),由于是两个进程所以没有阻塞的问题,如果解析过程中碰到了javascript,那么DOM,并且javascript的执行需要等到cssom构建完毕,下一步构建渲染树是需要两个树都是在完成构建的状态。

(2) 此时要构建渲染树了,先从DOM树的根节点开始逐层遍历,然后依次在cssom中找到对应的样式并合并到渲染树,如果碰到了隐藏样式那么

直接在渲染树种忽略。

(3) 对渲染树进行'布局',之前的所有操作都没涉及浏览器窗口,他们就是在这个阶段联系起来的,这样渲染树才能适应不同大小的窗口,这时所有的位置和尺寸都被转换为像素(px)

(4) 最后是将布局树转换格式传给浏览器引擎,在浏览器窗口绘制。

2、css阻塞

从上文中我们知道css是阻塞的也是非阻塞的,阻塞渲染树的构建,但是对于dom树的构建是不阻塞的。如果在构建渲染树时是不阻塞的会发生什么,我们会看到'纯html'没有任何样式,这样是不友好的,但是某些时候我们确实想让它是不阻塞的,比如涉及打印的样式,在特定大屏上的样式,因为他们对渲染的影响比较小,此时可以采用媒体属性(media)

注: 不阻塞不是不下载,只是在首次合成渲染树时不受它的阻塞

3、javascript阻塞

从衣食父母-浏览器中我们知道javascript脚本的执行是会阻塞DOM树的构建的,并且在cssom构建完毕前停止执行,这样会有很大的性能开销,有没有不阻塞的方法呢?

1、外部js异步加载

2、 内联js异步执行

function h () {    console.log(document.querySelectorAll('h1'))}setTimeout(h, 0)

转载地址:http://ekboa.baihongyu.com/

你可能感兴趣的文章
增加改查——android数据库篇二
查看>>
control file parallel write等待事件
查看>>
关键字volatile在c语言下的理解
查看>>
交换机带内、带外管理概念
查看>>
月PV破15亿:Tumblr架构揭密
查看>>
***微信浏览器禁止app下载链接怎么办
查看>>
iOS学习之NSBundle介绍和使用
查看>>
如何解决Eclipse中书写XML元素没有提示的问题
查看>>
首届中国(哈尔滨)航空航天3D打印材料博览会暨高峰论坛开幕
查看>>
创建周期性计划任务cron
查看>>
IV 7 MySQL REPLICATION
查看>>
在 docker 之间导出导入镜像的方法
查看>>
【总结】HDFS源码之INode相关类
查看>>
Java笔记11:RETURN注意事项
查看>>
docker : 报错 WARNING: IPv4 forwarding is disabled. Networking will not work.
查看>>
PLSQLDeveloper连接远程Oracle数据库
查看>>
jsonp 跨域原理详解
查看>>
编译安装php 附加一键安装php5.6.30脚本
查看>>
查看所有用户和用户组
查看>>
12.13 Nginx防盗链;12.14 Nginx访问控制;12.15 Nginx解析php相关配置;12.16 Nginx代理...
查看>>