资源加载(减少http请求数)
懒加载
-
图片
视图外的图片不加载,图片进入可视范围后再加载
- 原理:图片初始化时,显示默认静态图片(src属性),图片进入可视范围后,将src替换为图片真实url地址
- 实现:
- 元素距页面顶端的位置 < 浏览器窗口大小 + 网页上方的滚动高度
el.offsetTop < el.clientHeight + document.documentElement.scrollTop
- 元素的顶部在视口范围内
getBoundingClientRect()
- 元素和视口范围有交叉
intersectionObserve()
- 元素距页面顶端的位置 < 浏览器窗口大小 + 网页上方的滚动高度
-
组件
js模块:动态import
预加载
预先加载后续内容
列表渲染
- 分片渲染
- 时间分片
- 分页渲染
- 虚拟列表
- 只加载可视范围的列表,计算当前数据首尾索引,只渲染这些数据,其余的数据删除
图片压缩
-
base64
将较小的图片以base64格式内嵌到html中
webpack
url-loader
配置 -
WebP
google推出的图片格式,能压缩图片大小
-
SVG
-
缩略图
列表展示图片时使用缩略图
-
精灵图
多张图片合并为一张大图,使用
background-pisition
设置图片位置
HTTP缓存
-
强缓存
缓存过期前,强制使用缓存数据,不发送新请求
响应头中设置:
-
Cache-Control: max-age = <second>
资源过期秒数
-
Expries: <Time>
资源过期时间戳
-
-
协商缓存
缓存过期后,和服务器协商确认数据是否要更新
响应头中设置:
-
Last-Modify: <Time>
资源最后被修改的时间戳
-
If-Modified-Since: <Time>
资源过期后,向服务器发送请求,询问“该时间戳后该资源是否有被更改”
服务端比对
If-Modified-Since
与服务器中该资源的最后修改时间无修改:返回304
修改:返回200 + 最新数据
-
ETag
可以为hash值或版本号
-
If-None-Match
-
代码结构
-
CSS写在
<header>
尾部,JS写在<body>
尾部html解析前就能加载CSS形成CSSOM,更早地合并DOM渲染
JS会阻塞页面渲染,且可能改变页面结构,
脚本优化(JS)
-
压缩文本资源
去掉多余空格,移除注释或无用变量
-
防抖节流
-
事件委托
-
哈希表缓存
-
防止内存泄漏
-
减少重绘回流