页面是浏览器的核心,浏览器中的所有功能都是服务于页面的,Chrome开发者工具又是调试页面的核心工具。
详细信息中的Timing
大概率因为每个域名同时维护6个TCP连接,基于这个原因可以使用域名分片技术,即把该站点下面的资源放在多个域名下。另外可以将站点升级至HTTP2,因为HTTP2下面已经没有每个域名同时维护6个TCP连接的限制了(可通过curl -I 域名方式查看HTTP协议版本)。
可能是字节数太多的原因导致的。这时候你就需要减少文件大小,比如压缩、去掉源码中不必要的注释等方法。
网络传递给渲染引擎的HTML文件字节流渲染引擎是无法理解,需要将其转换为其能够理解的内部结构,这个内部结构就是DOM,DOM提供了对HTML文档结构化的表述,主要作用有三种:
简言之:通过HTML解析器,将HTML字节流转换为DOM结构。
首先在上一节基础上进行一个小扩展,Chrome浏览器的预解析线程会先对文件中扫描到的js或者css文件进行一个提前下载数据的阶段,然后这个阶段就可能会因为下载文件而造成阻塞。 然后,渲染流水线需要CSSOM是因为浏览器一样无法直接理解CSS,需要转换成CSSOM,然后进行样式计算、计算布局等阶段。 最后,渲染流水线的流程再简单梳理一遍就是:HTML解析器再接收到数据后,预解析器识别出了有CSS和JavaScript文件,会预先对这些资源进行同步下载,然后生成DOM之前,由于DOM受JS影响,而JS又受CSSOM影响,所以,首先保证的是CSS的下载完成、CSSOM的结构生成。 针对这个渲染流程的阶段分析,其白屏瓶颈为:下载CSS和JavaScipt以及执行JavaScript的时间,因此缩短白屏时长的策略有:
每个显示器都有固定的刷新频率,通常是60HZ,也就是每秒更新60张图片,更新的图片都来自显卡中一个叫做前缓冲区的地方,显示器的工作就是每秒固定读取60张从前缓冲区中的图像,显示在显示器上。 这个显卡的作用就是合成新的图片,将生成的图片保存在后缓冲区,然后与前缓冲区进行交换,其刷新频率和显示器一致。
我们在滑动页面或者手势缩放页面的过程中,屏幕产生了相应的效果,这是因为滚动或者缩放的这个操作,渲染引擎迅速捕捉到这个动作并将60张图片更新到显卡的后缓冲区,然后显卡的后缓冲区与前缓冲区进行交换,显示器从显卡前缓冲区读取这个图像,显示在显示器上。 将渲染流水线生成的每一张图片称为一帧,每秒更新了多少帧称为帧率。 于是,要解决一帧生产时间过久的问题,Chrome对浏览器渲染方式做了大量工作,其中最卓有成效的就是引入了分层和合成机制。
生产一帧的生成方式有重绘、重排、合成三种方式。
分层是将多个素材分解成多个图层处理,将这些图层合并在一起就叫做合成。 然后根据阶段一的内容,我们知道在(构建DOM树、样式计算、布局阶段) 后,就是分层的过程,之所以需要分层,是后续的流程需要根据这个层来干事情,比如再之后的绘制会对每一个层生成一个个绘制指令,然后光栅化阶段根据一个个指令生成图片,一个图层就是一张图片,最后合成线程就将一张张图片进行合成一张图片,将最终生成的图片发送至显卡的后缓冲区。 这就是分层和合成的流程。 需要特别注意的是:合成的这个操作是在合成线程中完成的,不会影响主线程执行。
通常页面内容比显示器内容要大很多,若等待所有图片都生成完毕再通过和合成生成一张图片的话,开销会很大,因此合成线程会优先绘制靠近视口的图块,且在首次合成图块的时候使用了一个低分辨率的图片。等正常比例的网页内容绘制好之后,再替换掉当前显示的低分辨率内容。
当对一些元素进行几何形状变换、透明度变换、缩放等操作时,使用JS操作会牵扯到整个渲染流水线,而使用CSS则只会经过合成线程的合成阶段,效率要大很多。 也就解释了为什么CSS动画要比JavaScript动画效率高。
这里讨论的优化页面是指:如何更快的让页面显示和响应。 而页面的周期分为加载阶段、交互阶段和关闭阶段,前两个阶段是用户体验的主要阶段。
加载阶段也就是资源下载整合的阶段,这些资源包括图片、音频、视频等不会影响阻塞页面首次加载的资源,以及JS、CSS、HTML等阻塞首次渲染的资源。 阻塞首次渲染的资源称为关键资源,优化点有:
DOM缺陷就是往往一个小的DOM操作,渲染引擎需要进行重排、重绘、合成等操作,这些操作非常频繁且耗时,会带来性能问题。 然后需要一种方式来减少JS对DOM的操作,于是虚拟DOM就来了。
虚拟DOM的作用是:
PWA:Progressive Web App 渐进式网页应用。
相对于本地应用,Web应用缺少的是:
主要思想是:在页面和网络直接增加一个拦截器,用来缓存和拦截请求。 这个拦截器是干嘛的呢:没有安装 Service Worker 之前,WebApp 都是直接通过网络模块来请求资源的。安装了 Service Worker 模块之后,WebApp 请求资源时,会先通过 Service Worker,让它判断是返回 Service Worker 缓存的资源还是重新去网络请求资源。一切的控制权都交由 Service Worker 来处理。
Web Worker是为了避免一个JS脚本执行占用主线程时间过长这个问题而出现的。 Web Worker是运行在页面主线程之外的,但Web Worker当中没有当前页面的DOM环境,因此只能执行和DOM无关的脚步,并通过postMessage方法将执行结果返回给主线程,也就是说,Web Worker是在渲染进程中开启的一个新线程。 然后Service Worker借鉴了Web Worker的核心思想:‘让其运行在主线程之外’,而由于Web Worker是临时的,执行结果保存不下来,因此Service Worker增加了储存功能。 安全设计上,Service Worker采用HTTPS协议。
怎么理解组件化呢:对内高内聚、对外低耦合。
WebComponent给出的解决思路就是提供局部视图封装能力,让CSS和HTML和JS运行在局部环境,已使得不会影响全局。 他的实现简单概括为: 使用template属性来创建模板,使用影子DOM提供局部作用域,将template中DOM和CSS与全局进行隔离。
影子DOM的作用主要有两类:
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有