1. 渲染机制
什么是DOCTYPE
及作用 → 浏览器渲染过程 → 重排Reflow → 重绘Repaint → 布局Layout
1.1 什么是DOCTYPE
及作用
DTD (document type definition,文档类型定义)是一系列的语法规则,用来定义 XML 或 (X)HTML 的文件类型。浏览器会使用它来判断文档类型,决定使用何种协议来解析,以及切换浏览器模式。
DOCTYPE 是用来声明文档类型和 DTD 规范的,一个主要的用途便是文件的合法性验证。如果文件代码不合法,那么浏览器解析时就是出一些差错。
HTML 51
HTML 4.01 Strict1
2//该 DTD 包含所有 HTML 元素和属性,但不包括展示性的和弃用的元素(比如 font)。不允许框架集(Framesets)。
HTML 4.01 Transitional
1 | //该 DTD 包含所有 HTML 元素和属性,包括展示性的和弃用的元素(比如 font)。不允许框架集(Framesets)。 |
1.2 浏览器如何渲染页面
浏览器解析
1、浏览器通过请求的 URL 进行域名解析,向服务器发起请求,接收文件(HTML、CSS、JS、img等等);
2、HTML 文件加载后开始构建 DOM Tree;
3、CSS 文件加载后开始解析和构建 CSS Rule Tree;
4、Javascript 脚本文件加载后, 通过 DOM API 和 CSSOM API 来操作 DOM Tree 和 CSS Rule Tree
浏览器渲染
浏览器渲染主要有三个步骤:
1、解析。浏览器会解析HTML/SVG/XHTML,浏览器解析这三种文件会产生一个DOM Tree;解析CSS,产生style rules;解析Javacript,主要通过DOM API和CSSOM API来操作DOM Tree和CSS Rule Tree。
2、解析完成后,浏览器引擎会通过DOM Tree和CSS Rule Tree来构造Rendering Tree。
3、调用操作系统Native GUI的API绘制。
1.3 重排 Reflow 和重绘 Repaint 注1注2
Reflow
当元素改变的时候,将会影响文档内容或结构,或元素位置,此过程称为 Reflow。( HTML 使用的是 flow based layout ,也就是流式布局,所以,如果某元件的几何尺寸发生了变化,需要重新布局,也就叫 Reflow。)
1 | 当你增加、删除、修改DOM结点时,会导致Reflow或Repaint |
Repaint
当元素改变的时候,将不会影响元素在页面当中的位置(比如 background-color, border-color, visibility),浏览器仅仅会应用新的样式重绘此元素,此过程称为 Repaint。
屏幕的一部分要重画,比如某个CSS的背景色变了。但是元素的几何尺寸没有变。
2. JS运行机制
如何理解JS的单线程 → 什么是任务队列 → 什么是Event Loop
异步任务:setInterval()和setTimeout、DOM事件、ES6中的Promise
3. 页面性能关于页面性能
题目:提升页面性能的方法有哪些?
1、资源压缩合并,减少HTTP请求;
2、非核心代码异步加载(异步加载的方式、异步加载的区别)
3、利用浏览器缓存(缓存的分类、缓存的原理)
4、使用CDN
5、预解析DNS
1 | <meta http-equiv="x-dns-prefetch-control" content="on" /> |
3. 1 异步加载的方式
1、动态脚本加载
1 | (function(){ |
2、defer
1 | <script>标签的defer="defer"属性 |
3、async
1 | <script>标签的async="async"属性 |
3.2 异步加载的区别
1、defer
是在HTML解析完之后才会执行,如果是多个,按照加载的顺序依次执行;
2、async
是在加载完之后立即执行,如果是多个,执行顺序和加载顺序无关。
3.3 浏览器缓存注
强制缓存:
Expires
:服务器返回的一个绝对时间,在服务器时间与客户端时间相差较大时,缓存管理容易出现问题,比如随意修改下客户端时间,就能影响缓存命中的结果。
Cache-Control
:是一个相对时间,在配置缓存的时候,以秒为单位,用数值表示。
协商缓存:
Last-Modified、If-Modified-Since
:
ETag、If-None-Match
:
4. 错误监控
前端错误的分类 → 错误的捕获方式 → 上报错误的基本原理
4.1 前端错误的分类
即时运行错误:代码错误
资源加载错误
4.2 错误的捕获方式
即时运行错误的捕获方式:
1 | 1. try..catch |
资源加载错误:1
2
3
4
51.object.onerror
2.performance.getEntries()
3.Error事件捕获
延伸:跨域的JS运行错误可以捕获吗,错误提示什么,应该怎么处理?
1 | 1.在script标签增加crossing属性 |
4.3上报错误的基本原理
1、采用Ajax通信的方式上报
2、利用Image对象上报
1 | (new Image()).src="http://baidu.com/test?r=bhhj"; |