性能优化专题
# 性能优化专题
# 减少 http 请求
因为每次请求都要经过 dns、TCP 握手,服务器响应等等一系列事情
- 多个小文件合并一个大文件,
# 使用 http2
相较于 http1.1 有如下几个优点
解析速度快
http1.1 明文传输,必须不断地读入字节,遇到分隔符或者回车换行,在内部还需要用状态机去识别,效率低下。
http2 采用二进制分帧,便于解析,服务器收到一堆乱序的二进制帧,所谓乱序,是指不同 ID 的 Stream 是乱序的,但同一个 Stream ID 的帧一定是按顺序传输的,二进制帧到达后对方会将 Stream ID 相同的二进制帧组装成完整的报文。
多路复用
多个请求可以共用一个 TCP 连接
首部压缩
针对头部字段采用 hpack 压缩,建立 hash 表记录索引和出现过的字段名,实现了请求头字段的复用
对于整数和字符串哈夫曼编码,也是根据先出现的字符建立哈希表,出现次数多的字符索引尽可能短。传输的时候直接传输索引序列。
服务端推送
在 http2 中,服务器也能新建 Stream 给客户端发送消息,当 TCP 连接建立之后,服务器可以在返回 Html 的基础上,额外推送 html 中的 css,js 文件一起返回给客户端,减少等待和请求次数
# 流的特性
并发性。一个连接上可以同时发送多个帧,这一点和 HTTP1 不同。这也是实现多路复用的基础
自增性。流 ID 是不可重用的,到达上限会新开 TCP 连接
双线性。两端都可以创建流,互不干扰,双方都可以作为发送方或者接受方
可设置优先级。可以设置数据帧优先级,先处理重要资源
# 服务端渲染
在服务端完成挂载、数据填充、渲染 dom 后,将成品返回给客户端,可以直接绘制页面。
# 优势
更快的内容到达时间
SSR 只需要一次请求,一个文件,而 CSR 需要请求多个 JS、CSS 才能完成渲染
# 静态资源用 CDN
cdn 的缓存服务器是就近原则,缩短了请求时间,避免每次都请求源站
# CSS 放在头部,JS 放在底部
- 如果先加载 html 再加载 CSS,用户第一时间看到的就是原始画面
- JS 如果放在头部,加上 defer 标签,异步下载,延迟执行
# 压缩文件
webpack 的一些插件,压缩 CSS、JS、HTML 体积,
UglifyJS
MiniCssExtractPlugin
tersernginx 开启 gzip 压缩
# 图片优化
图片延迟加载
媒体查询,使用合适大小的图片
用 CSS 效果代替图片、gif
使用 webp 格式图片
WebP 的优势体现在它具有更优的图像数据压缩算法,能带来更小的图片体积,而且拥有肉眼识别无差异的图像质量;同时具备了无损和有损的压缩模式、Alpha 透明以及动画的特性,在 JPEG 和 PNG 上的转化效果都相当优秀、稳定和统一。
webpack 按需加载,preload,prefetch
esbuild 依赖预加载
# 使用事件委托
- 只需要将同类元素的事件委托给父级或者更外级,不需要给所有元素都绑定事件,减少内存占用,提升性能
- 动态新增的元素无需重新绑定事件
# 减少重绘重排
# 条件判断改为查找哈希表
# 使用位操作
# 降低选择器复杂性
- 选择器越短越好
- 使用高优先级选择器,例如 id class
- 避免使用通配符*
- 使用 flex(条件允许)
- 使用 transform 和 opacity 实现动画