前端性能优化
· 阅读需 4 分钟
内容方面
- 减少 HTTP 请求:雪碧图、合并文件
- 减少 DNS 查询:DNS 缓存、将资源分布到恰当数量的主机名,平衡并行下载和 DNS 查询
- 避免重定向:多余的中间访问
- 组件加载:非必须组件延迟加载,未来所需组件预加载
- DOM 元素:减少 DOM 元素数量、或者是减少 DOM 元素嵌套的深度
- 将资源放到不同的域下:浏览器同时从一个域下载资源的数目有限,增加域可以提高并行下载量。这个限制的目的是防止网站占用大量网络带宽导致其他网站网络质量变差。大多数浏览器都有默认的并行请求数限制,通常是在 6 到 8 之间。
- 减少 iframe 数量:iframe 会阻塞主页面的 Onload 事件及 iframe 和主页面共享连接池,会影响页面的并行加载。并且 iframe 加载速度慢同时也不利于 SEO。
服务器方面
CDN
:常用的包用CDN
代替,https://www.bootcdn.cn/- 添加
Expires
或者Cache-Control
响应头来设置缓存,尽可能的使用本地缓存,减少服务器压力,增强用户体验 - 使用
Gzip
压缩:注意!!! 图片和PDF
文件不要使用gzip
。它们本身已经压缩过,再使用gzip
压缩不仅浪费CPU
资源,而且还可能增加文件体积。 - 配置
ETag
:Etag
通过文件版本标识,方便服务器判断请求的内容是否有更新,如果没有就响应304
命中本地缓存,避免重新下载。 - 避免空
src
的img
标签:src
属性为空时,浏览器在渲染的过程中仍会将href
属性或src
属性中的空内容进行加载,直至加载失败,这样就阻塞了页面中其他资源的下载进程,而且最终加载到的内容是无效的,因此要尽量避免。可以使用一个Base64
的图片来作为骨架屏。
CSS 方面
- 将样式表放到页面顶部
- 减少
CSS
类名的嵌套深度 - 不使用
CSS
表达式:在前端这块避免使用CSS
表达式,因为它的重绘次数非常多,相当的影响性能。但是calc
方法不会有性能问题 - 如果你使用的是
Sass/Scss/Less
要尽可能合并相同的样式规则 - 使用
CSS
压缩工具压缩CSS
文件 - 异步加载样式表,避免阻塞页面渲染。
<link rel="preload" href="style.css" as="style">
Javascript 方面
- 将脚本放到页面底部,不影响
DOM
的渲染 - 压缩
JavaScript
和CSS
- 删除不需要的脚本
- 尽可能的用类名操作样式,而不是直接操作
DOM
样式 - 合理
setTimeout
、setInterval
,使用时候用变量接收移除并赋值为null
- 使用
documentFragment
来减少DOM
操作的次数 - 全局变量的访问会比局部变量慢,因此应该尽可能地使用局部变量
- 如果数组过大,尽量减少数组的操作,例如使用
forEach
方法取代for
循环。 - 遇到
CPU
密集型的场景可以使用Web Workers
Vue 方面
- 尽可能的使用
v-show
,减少DOM
操作 - 多使用计算属性,因为它会缓存值
v-for
的时候必须添加Key
,没有Key
就用nanoId
- 禁止
v-for
和v-if
连用,当它们处于同一节点,v-for
的优先级比**v-if
更高**,这意味着v-if
将分别重复运行于每个v-for
循环中 - 图片懒加载
- vue-router 使用懒加载
- 按需引入不同的包,这很重要,大多时候包体积过大都是没有按需引入
- 服务端渲染提升首屏用户体验
- 使用 mixin 提取公共逻辑
- 长列表性能优化:只用于展示的可以
freeze
对象
export default {
data: () => ({
users: {}
}),
async created() {
const users = await axios.get("/api/users");
this.users = Object.freeze(users);
}
};
Webpack 方面
- 可以用
image-webpack-loader
来压缩图片 - 提取公共代码
- 使用
SourceMap
解决构建后的项目无法精准定位错误的问题 - 构建结果输出分析使用
webpack-bundle-analyzer
- 使用
Tree Shaking
剔除JS
死代码,它正常工作的前提是代码必须采用ES6
的模块化语法
其他方面
Chrome Performance
:使用Chrome
开发者工具分析页面性能- 让用户使用
Chrome
- 使用
Git
管理代码,而不是使用SVN
- 团队代码尽可能使用
ESlint
保证编码风格