Post

前端优化

前端优化

网络请求

  • 减少HTTP请求
  • 使用HTTP/2协议
  • 减少cookie传输
  • 开启gzip

静态资源

  • 使用CDN存储
  • 字体图标代替图片图标
  • 资源缓存
  • 文件压缩

首屏加载

  • 服务端渲染
  • 白屏loading

交互体验

  • 图片优化
    • 延迟加载
    • 降低图片大小
    • 用CSS效果替代图片
    • 使用webp格式图片
  • 按需加载
  • 预加载:preload & prefetch
  • 减少重绘重排
  • 骨架屏
  • 可视区域渲染

脚本性能

  • 脚本放在页面底部
  • 减少DOM操作
  • 使用位操作
  • 动画使用requestAnimationFrame
  • 合理使用事件委托
  • 使用web worker

样式性能

  • 样式表放在head中
  • 不使用CSS表达式
  • 降低选择器的复杂性
  • 优先使用flex布局
  • 使用transform和animate来实现过渡和动画

减少reflow和repaint

  • 不要通过父级来改变子元素样式,最好直接改变子元素样式,改变子元素样式尽可能不要影响父元素和兄弟元素的大小和尺寸
  • 尽量通过class来设计元素样式,切忌用style 多次操作单个属性
  • 实现元素的动画,对于经常要进行回流的组件,要抽离出来,它的position属性应当设为fixed或absolute
  • 权衡速度的平滑。比如实现一个动画,以1个像素为单位移动这样最平滑,但reflow就会过于频繁,CPU很快就会被完全占用。如果以3个像素为单位移动就会好很多。
  • 不要用tables布局的另一个原因就是tables中某个元素一旦触发reflow就会导致table里所有的其它元素reflow。在适合用table的场合,可以设置table-layout为auto或fixed,
  • 这样可以让table一行一行的渲染,这种做法也是为了限制reflow的影响范围。
  • css里不要有表达式expression
  • 减少不必要的 DOM 层级(DOM depth)
  • 避免不必要的复杂的 CSS 选择器,尤其是后代选择器(descendant selectors),因为为了匹配选择器将耗费更多的 CPU。
  • 尽量不要过多的频繁的去增加,修改,删除元素,因为这可能会频繁的导致页面reflow,可以先把该dom节点抽离到内存中进行复杂的操作然后再display到页面上。
  • 请求如下值offsetTop, offsetLeft, offsetWidth, offsetHeight,scrollTop/Left/Width/Height,clientTop/Left/Width/Height,浏览器会发生reflow,建议将他们合并到一起操作,可以减少回流的次数。

webpack优化策略

  • 使用最新版本
  • 文件压缩
  • 代码拆分
  • 分离两套环境
  • 模块热更新
  • 独立CSS文件
  • 减少查找过程
    • 合理配置resolve.extensoins
    • 优化resolve.modules
    • 设置resolve.alias
  • 缩小构建目标
    • excludes
    • includes
  • 利用多线程
    • HappyPack
    • thread-loader
  • 预先编译资源模块(DllPlugin)
  • 缓存Cache相关
    • babel-loader开启缓存
    • terser-webpack-plugin开启缓存
    • 使用cache-loader或者hard-source-webpack-plugin
  • 合理使用sourceMap
  • 使用ES6 Module语法,保证Tree-Shaking起作用
  • 合理使用Ployfill
  • 预加载资源webpackPrefetch
  • 使用CSS Sprite合并图片
  • 合理配置chunk的哈希值
This post is licensed under CC BY 4.0 by the author.

Trending Tags