图片优化
- 小图可以用雪碧图,精灵图
- 低于5K 的图片可以转换成 base64 内嵌,减少请求
- 合适格式,非透明用jpg,非苹果端用webp,可以用字体图标或svg矢量图
- 保真的情况下优化图片
- 不要在html缩放图片,设置图片的宽和高,以免浏览器按照[猜]的宽高给图片保留的区域和实际宽高差异,产生重绘。
- 使用体积小、可缓存的发Vicon.ico,存在 (避免404);尽量小,最好小于 1K;设置较长的过期时间。对于较新的浏览器,可以使用PNG格式的fawicon
- 图片懒加载,预加载
- cdn静态文件托管,延长静态缓存时间
- 为图片标明高度宽度,减少浏览器计算
页面结构
html
- 预加载->预解析dns meta a 标签中设置,并行下载,不会堵塞页面染,可以缩短资源加载时间
- css 文件
- 减少dom数量,避免不必要的节点或嵌套;语义化标签有利于 SEO 与浏览器的解析时间
- 避免减少使用 table 进行布局
- 减少iframe使用
- 避免404 比如外链的css、js文件出现问题返回404时,会破坏浏览器的并行加载。
- 将CSS和JS放到外部文件中 可以缓存文件
css
- 减少重排重绘
- css选择器嵌套少,少使用通配符和属性选择器,使用id选择器
- 不要放太多的base64在css,因为图片转换成base64也挺大的
- css 文件不大可以做成样式内联
- 不要使用css表达式使用 替代原生 @import
- 不要使用滤镜filter 问题很多增加内存开支
- 压缩css
- 不要滥用web字体,他要下载解析重绘当前页面
js
- 压缩js 减少http请求
- 减少dom操作,用变量缓存,多次合并成一次
- 移除重复代码
- 使用事件委托,避免大量的事件绑定
- 减少循环次数;减少遍历;完成目的后马上结束循环
- 数据读取,在局部作用域进行变量缓存;避免嵌套过深,数据扁平化
- 使用GET来完成AJAX请求:浏览器中的POST方法是一个”两步走”的过程:首先发送文件头,然后才发送数据。因此使用GET获取数据时更加有意义
- 合理使用 rquestAnimationFrame 动画代替 setTimeout。
网络资源优化(服务器
- 静态资源cdn缓存
- Gzip压缩 删除多余代码: tree-shaking UglifyJs code-spliting
- 正确设置 http缓存
- 强缓存
- 强缓存(也称本地缓存,状态码200),本地缓存是最快速的一种缓存方式,只要资源还在缓存有效期内,浏览器就会直接在本地读取,不会请求服务端。只有在地址栏或收藏夹输入网址、通过链接引用资源等情况下,浏览器才会启用 强缓存。
- 协商缓存
- 协商缓存(也称304缓存,状态码304),顾名思义是经过浏览器与服务器之间协商过之后,在决定是否读取本地缓存,如果服务器通知浏览器可以读取本地缓存,会返回304状态码,并且协商过程很简单,只会发送头信息,不会发送响应体。
- 强缓存
- 避免src href为空
- 除去不要的cookies设置过期时间,减少cookies的大小因为每个请求都得带着他跑使用无cookie的域,比如CSS、is、图片等,客户端请求静态文件的时候,减少了 Cookie 的反复传输对主域名的影响
- 升级到http2 多路复用
- 多路复用,无需多个TCP连接,因为其允许在单一的HTTP2连接上发起多重请求,因此可以不用依赖建立多个TCP连接。
- ssr服务端渲染,按需加载
- 多域名分发划分内容到不同域名
用户体验
- 加loading效果,减少对白屏的感知
- 加过度动画,能有效减少用户对卡顿的感知;-轮播图、导航栏、弹窗
- 动画数尽量保证在 30 以上,低数、卡顿的动画宁愿不要;
- 记住用户使用习惯--记住用户的输入信息,本地存储实现,如果用户开启了隐身模式,本地存储将会被禁掉,可以改用cookiesG避免页面闪动--可以把样式内联,因为他是和DOM一起出来的。
- 执行时间避免超过100ms,超过的话就需要做:寻找可缓存 的点;任务的分割异步 或 webworker 执行;
vue2项目优化
- v-if 和v-show 区分使用场景
- computed 和 watch 区分使用场景
- v-for 遍历必须为item 添加 key,且避免同时使用 v-if
- 长列表性能优化
- 事件的销毁
- 图片资源懒加载
- 路由懒加载
- 第三方插件的按需引入优化无限列表性能
- 服务端渲染SSR or 预渲染
Webpack层面的优化
- Webpack对图片进行压缩
- 减少ES6转为ES5的余代码
- 提取公共代码
- 模板预编译
- 提取组件的CSS
- 优化 SourceMap
- 构建结果输出分析
- Vue项目的编译优化