前端优化
要根据实际项目的情况进行对应的优化,下列为通用的
外链资源
静态资源优化
减少 http 请求的文件资源
- 合并 css、js 等文件
- 将小图片转成 base64
- 将 icon 转为字体文件
- 代码分割
- 按照路由分割,webpack 的 splitChunk 等工具
- 首屏资源懒加载,首屏不需要的资源,不加载
减少资源体积
- 压缩图片
- 压缩代码文件
- 采用 gzip 压缩
- 使用 css Sprites,将多张图片合成一张图片,再使用 background 进行控制,从而显示图片
优化请求
- 使用 cdn
- 减少 dns 查询
- 使用域名分发。因为每个浏览器,同时并行请求资源的数量有限(chrome 是 6 个,移动端更少),可以使用不同的域名,使并行请求的资源更多
- 使用缓存
- 浏览器的强缓存
- 服务器的缓存
- 对一些不常变化的资源(图片等媒体资源),通过配置 cache-controll 或 expires(http 1.0 的字段),设置资源的缓存
- 代码文件放置的位置
- 主要的样式文件,要放在 head 里面,不然 html 内容加载后,但是没样式会很丑
- js 文件放在
</body>
前,等 html 内容加载完后,再加载 js 文件,这样会减少首屏白屏的时间
- 预加载资源
- 当网络空闲时,可以请求一些虽未用到,但比较重要或将要用到的资源
- 比如在页面的 onload 或一些比较前的节点,进行加载
- 当网络空闲时,可以请求一些虽未用到,但比较重要或将要用到的资源
- 减少 404 请求的出现,因为 404 也算是一个 http 的请求
- 减少 cookie 的体积,因为每个请求都会带上 cookie,所以会影响传输的速度
- 对一些没有权限、自由的静态资源,有条件的情况,可以使用另外的域名,不带 cookie 的,这会减少一部分的大小
代码优化
- 减少 dom 操作
- 减少 dom 的数量
- 使用事件委托,减少添加的事件
- 找到需要添加事件的节点的父节点,添加相对应的事件,根据触发回调的事件对象中的 target 判断实际点击的是哪个节点
- 尽量减少 reflow 和 repaint (重排和重绘)
- reflow: 节点的某些属性发生变化了(颜色、背景、opacity等),是重绘
- repaint:部分节点需要重新计算的,是重排
- 修改某节点的 margin、padding、width、height、相对定位的 left、top、right、bottom、line-height 等属性
- 对某个节点添加动画时,使用 trasnform 代替 margin、left、top;给该节点添加绝对定位,会减少 repaint 时影响到的节点
- 减少 css 级联
- css 级联的查询,是从右到左开始
- 避免使用全局变量
- 避免 img 标签 src 是空值
- 这会导致浏览器向当前域名的服务器发送请求(旧的浏览器)
使用工具,进行针对性的优化
javascript
var timing = window.performance.timing
timing.domLoading //浏览器开始解析 HTML 文档第一批收到的字节
timing.domInteractive // 浏览器完成解析并且所有 HTML 和 DOM 构建完毕
timing.domContentLoadedEventStart //DOM 解析完成后,网页内资源加载开始的时间
timing.domContentLoadedEventEnd // DOM 解析完成后,网页内资源加载完成的时间(如 JS 脚本加载执行完毕)
timing.domComplete //网页上所有资源(图片等)下载完成,且准备就绪的时间
服务端渲染优化
服务端渲染有多个入口,将每个页面有重复的模块抽出来进行额外的打包(至于重复的数量是多少,按实际需求,比如只有几个页面是需要某个库的,那这几个页面才会加载这个额外的文件)