HTML代码压缩就是压缩这些在文本文件中有意义,但是在HTML中不显示的字符,包括空格、制表符、换行符等,还有一些其他意义的字符,如HTML注释也可以被压缩。
压缩方式:
使用在线网站进行压缩
nodejs提供的html-minifier工具
后端模板引擎渲染压缩
css:无效代码的删除、css语义合并,JS:无效字符的删除、剔除注释、代码语义的缩减和优化、代码保护。
压缩方式:
使用在线网站压缩
使用html-minifier对html中的Css进行压缩、对Html中JS进行压缩
使用clean-css对css进行压缩
使用uglifyjs2进行JS压缩
假设a.js、b.js、c.js三个文件,不合并压缩将会导致多次请求,文件与文件之间将会导致多个请求,增加网络延迟,丢包问题严重,keep-alive经过代理服务器获取资源也存在连接断开的问题。
文件合并存在的问题(合并结果abc.js),当渲染依赖于js文件时,将必须等到js文件加载,当合并文件abc.js太大,将会导致首屏渲染问题(空白页),例如Vue、React框架等,如果未使用服务端渲染时,必须要等框架代码加载完成,才能进行加载渲染,也会导致缓存失效问题,Js文件都是具有缓存性的,当任意一个文件被修改,都会导致全局abc.js文件改动。
改善:公共库合并(公共库与业务代码分割)、不同页面合并(对于单页面应用的某个页面被路由到才去发起请求,加载对应的页面组件)。
压缩方式:
使用在线压缩工具压缩图片,减小图片体积,针对不同浏览器采用不同类型图片。
多张图片合并(雪碧图),通过css截取选取图片位置,注意:可以设计多张雪碧图,针对不同加载采用设计,防止全局图片依赖加载过程太长。
输入浏览器地址,从服务器获取Html、JS、CSS数据,在页面构造中,解析HTML文档,构件DOM树,下载资源,构造CSSOM树,执行js脚本(并行)。解析过程中遇到图片、样式表、js文件,启动下载。
构建DOM树:
Tokenizing:根据HTML规范将字符流解析为标记
Lexing:词法分析将标记转换为对象并定义属性和规则
DOM construction:根据HTML标记关系将对象组成DOM树
构建CSSOM树:
Tokenizing:字符流转换为标记流
Node:根据标记创建节点
CSSOM:节点创建CSSOM树
构建RenderTree渲染树:
script
,meta
这样本身不可见的标签、被css隐藏的节点,如display: none
JS解析过程:
HTML渲染过程的特点:
顺寻执行、并发加载。(浏览器并发存在上限)
是否阻塞。(css加载是否会阻塞页面渲染和JS执行等)
依赖关系。(css在head中才会显示最终渲染好附带样式的页面、否则可能从在无样式页面,async脚本执行无序)
引入方式。(css使用link还是@import方式,link会阻塞页面加载,@import实在页面解析完成后执行,JS引入方式async、defer、module )
懒加载:对未进入可是区域中的图片,将真实地址放置在data-url中,当进入视野,替换src属性。
预加载:对于接下来将显示的内容进行预加载(例如:轮播时将下次显示的图片也加载出)。
重绘:当RenderTree中一些元素需要更新属性时,但是这些属性仅仅是影响元素的外观、风格,而不会影响布局的,比如background-color,则称为重绘。
回流:当RenderTree中一部分(或全部)因为元素的规模尺寸、布局、隐藏等改变而需要重新构建。这就成为回流。每个页面初次加载即发生回流。在回流中,因为渲染树中受影响的部分失效,并且重新构造这部分渲染树,完成回流后,则需要将绘制受影响内容重新替换到页面,则称为重绘。
区别:
触发回流的页面布局条件:
盒子模型相关属性、定位属性以及浮动、改变节点内容,具体属性:
CSS属性:width height padding margin display border-width border min-height top left right bottom position float clear line-height text-align overflow-y font-weight overflow font-family vertival-align white-space font-size。
触发重绘的条件:
CSS属性:color、border-style、border-radius、visibility、text-decoration、background、background-image、background-position、background-repeat、background-size、outline-color、outline、outline-style、outline-width、box-shadow。
避免重绘、回流方法:
避免使用触发重绘、回流的CSS属性或者将重绘、回流的影响范围限制在单独的图层内,原因如下:
新建DOM过程:
因此,将频繁重绘回流的DOM元素单独做为一个独立图层,该DOM元素的重绘和回流的影响只会影响这个图层,但是当图层太多,将会导致图层合并Composite Layers时间太长。除此之外,Chrome也存在创建图层条件:3D或透视变换CSS(transform 、perspective)、视频编码(video)、3D上下文或者加速的2D上下文的节点(WebGL 和 Canvas)、混合插件(Flash)、对opacity元素做动画或者使用一个动画webkit变换的元素、拥有加速CSS过滤器的元素、元素拥有子元素(子元素有属于自己的图层)、元素拥有z-Index属性且包含符合层的兄弟元素(图层上下位关系)。
图层查看方式: