目录
一:资源的压缩与合并
1.1.为什么要压缩&合并
1.2.HTML压缩:
1.3.CSS压缩:
1.4.JS 压缩与混淆:
1.5.CSS JS 文件合并:
二:图片格式优化
2.1.JPEG/JPG:
2.2.PNG:
2.3.WebP:
三:图片加载优化
3.1.图片的懒加载(lazy loading)
3.2.渐进式图片
3.3.响应式图片
四:字体优化
4.1.什么是 FOIT 和 FOUT
4.2.使用 font-display
4.3.使用 Ajax + Base64
请求的越多,所造成的网络开销就越大
资源越小,加载的就越快,再去进行资源的解析和渲染就越快
资源优化不是吧所有的技术都用上,要根据实际情况选择适合自己的优化策略
使用在线工具进行压缩
使用 html-minifier 等 npm 工具
html-minifier-terser 以html-minifier为例,我们可以看到压缩后的HTML文件可节约30%
PS:html-minifier已经集成了clean-css,不用单独去使用
比如有 20 个 CSS,合并成一个 CSS 可能会比 20 个分别加载要快,因为每个资源请求都要经历不同的阶段:进行 DNS 查找、TCP 链接建立等(这两个可以复用),TTFB 这个没办法避免,20 个肯定会比 1 个稍微大写,缺点是合并的话维护带来麻烦
基于以上内容,所以我们要对不同问题进行分别处理:
1.若干小文件。比如有 20 个 CSS,每个才几K,这样可以考虑将它们都合成一个
2.对JS而言,合并完不会造成冲突,且都服务相同的模块,那可以进行合并来优化。如果只是单纯的去进行网络的加载优化,这是不可行的,因为这可能会造成长时间白屏问题,我们更关心的在于用户的体验问题。(目前对JS文件的拆分相对还是更多一些)
先来看一下图片优化的几种方式
图片格式比较
下面两个是能将JPEG/JPG图像进行压缩以及在线压缩的网站
imagemin
https://imagemin.saasify.sh/
优点:压缩比很高,画质还可以很好的保存,色彩保留也很丰富。
使用场景:需要展示比较大的图片时,还想保留画质和色彩
缺陷:如果图片比较强调纹理或边缘,JPG 会显得有锯齿感或模糊,比如:Logo 不会用 JPG,边缘会显得粗糙
下面是能将PNG图像进行压缩的网站
imagemin-pngquant
优点:可以做透明背景的图片,PNG也有 24 位格式,色彩丰富程度也是没问题。通常 quality 设置在 65% ~ 80% 之间是比较好的,这样可以达到 80% 的压缩比率
使用场景:想强调线条、纹理、边缘这些细腻程度时
缺陷:因为保留了细节,所以体积相对会大些
Google 新提出的图片格式,已经推了几年,跟 PNG有相同的质量,但是压缩比率比 PNG 要高。缺点是普及程度不是很高
下面是各大浏览器对WebP的适配程度:
我们前端优化所说的懒加载就是指图片的懒加载
1.原生的图片懒加载方案
示例网站:
img-loading-lazy
特点;需要浏览器进行支持,自定义以及可扩展性不是特别的好
2.第三方图片懒加载方案
vanilla-lazyload :用于延迟加载图片、背景图像、视频、iframe 和脚本。它利用 Intersection Observer,支持响应式图像
yall.js:使用 Intersection Observer 并回退到事件处理程序的库
lozad.js:使用 Intersection Observer 的轻量级选项
图片不是一步到位加载出来,而是由模糊逐渐变清楚
渐进式图片的优点和不足:
渐进式图片的解决方案:
不同屏幕尺寸都有一张合适的图片给用户达到最佳视觉体验,主要通过img标签的以下两个属性进行实现
srcset属性:定义了浏览器可选择的图片设置以及每个图片的大小
sizes属性:定义了一组媒体条件(例如屏幕宽度)并且指明当某些媒体条件为真时,什么样的图片尺寸是最佳选择
或者通过picture标签包含零或多个
网页上的大部分内容以文字的形式展示给用户,为了让文字展示更漂亮,很多时候会使用自定义字体,这些字体资源就会通过网络加载到客户端
Flash Of Invisible Text
文字从看不到到看到的闪烁变化过程
Flash Of Unstyled Text
没有经过样式渲染,也就是文字开始看上去是一种样式,后来经过样式渲染又变成另外一种样式,没有中间这个变化和闪动的过程
这个属性有 5 个值:
auto
block:开始不让文字进行显示,3s 之后字体下载完再用你的字体,3s 之后字体还没下载完,先用默认字体显示,直到字体下载完再换成你的字体
swap:开始就使用默认字体进行显示,直到字体下载完成之后再换成你的字体,用户一开始就可以很快看到字体,不会看到白屏
fallback:对 block 的优化,开始不显示的等待时间缩短了,只有 100ms
optional:为手机端进行优化,浏览器用100ms判断用户网络情况,如果速度比较好,那就用你下载的字体,如果下载不下来,就用默认字体进行显示。缺点是一旦选择了某种字体后就不会再去进行变换了。
使用 Base64 把字体进行转码或嵌到 CSS 里或 JS 里,再进行加载,转码之后通过异步请求的方式去获取这个字体。
优点:通过Base64把字体进行转换之后,达到了统一的格式,解决了兼容性的问题;其次通过异步去进行加载,推迟了字体进行加载的时间
缺点:把 Base64 嵌到其他资源里,导致文字就没有办法进行缓存,它的缓存实际就依赖于 CSS 的缓存,所以它的过期或者缓存就变得不可控
总的来说,不是最佳,但是可以考虑的一种方案