史上最全的前端性能优化方案

240 阅读10分钟

从css方面

  1. 减少网络请求: 合并和压缩 CSS 文件,以减少文件大小,从而减少网络传输时间。可以使用工具如Webpack、Parcel等进行自动合并和压缩。
  2. 使用适当的选择器: 避免使用过于通用的选择器,这可能导致不必要的样式计算和渲染。尽量使用具体的类名和ID来限制选择器的范围。
  3. 避免使用昂贵的属性: 避免使用计算代价较高的 CSS 属性,如 position: fixedbox-shadow。在可能的情况下,使用更轻量的替代方案。
  4. 使用缓存: 利用浏览器的缓存机制,确保样式文件能够被缓存,减少不必要的网络请求。使用适当的缓存头来控制缓存策略。
  5. 避免使用 !important: !important 会覆盖其他样式,增加样式的优先级。在正常情况下,应该避免过度使用 !important,以免引起样式的不可预测性。
  6. 使用字体图标: 使用字体图标代替图片,减少 HTTP 请求,提高性能。常见的字体图标库包括 FontAwesome 和 Material Icons。
  7. 懒加载和异步加载: 对于不是页面首次加载必需的样式,可以延迟加载或异步加载,以减少初始加载时间。
  8. 媒体查询和响应式设计: 使用媒体查询创建响应式设计,确保页面在不同设备上都有良好的表现。避免在移动设备上加载不必要的大型样式。
  9. 使用 CSS Sprites: 将小图标合并到一张大图中,通过 CSS 的 background-position 属性显示不同的图标,减少 HTTP 请求次数。
  10. 避免使用 @import: @import 在加载样式时可能导致额外的延迟。最好使用 link 标签来引入样式表,以并行加载。
  11. 使用 GPU 加速: 避免触发页面的重绘和回流,尽量使用可以利用 GPU 加速的属性,如 transformopacity
  12. 优化动画性能: 使用 transformopacity 进行动画,避免使用会触发重绘的属性,如 widthheight

从js方面

  1. 延迟加载和异步加载: 将不必要立即执行的脚本延迟加载或异步加载,以减小初始加载时间。可以使用 asyncdefer 属性,或通过 JavaScript 动态创建 <script> 标签来实现。
  2. 避免全局变量: 减少全局变量的使用,将变量限制在局部作用域中。过多的全局变量可能导致命名冲突和内存泄漏。
  3. 懒加载: 仅加载当前页面所需的 JavaScript 代码,可以在用户与页面交互时再加载其他代码。懒加载可以通过模块化加载(如ES6 模块)或使用工具如 import()(动态导入)来实现。
  4. 使用事件委托: 通过事件委托将事件处理程序绑定到父元素,减少事件处理程序的数量。这样可以减小页面上的事件监听器数量,提高性能。
  5. 避免不必要的重绘和回流: 尽量避免频繁修改导致浏览器重新计算布局的操作,例如通过批量处理 DOM 操作、使用文档片段、使用 CSS 动画等。
  6. 合理使用缓存: 使用适当的缓存机制,避免重复计算相同的结果。可以使用 memoization 技术,或者利用浏览器缓存。
  7. 优化循环: 在循环中尽量避免复杂的操作,减小循环体内的计算量。可以使用更高效的迭代方法,如 map()filter() 等。
  8. 避免使用同步请求: 尽量使用异步请求,避免阻塞主线程。可以使用 async/awaitPromise 来处理异步操作。
  9. 使用 Web Workers: 将一些计算密集型的任务放在 Web Workers 中执行,以在后台线程中进行处理,不影响主线程的性能。
  10. 使用事件缓存: 对于频繁触发的事件,使用节流(throttling)和防抖(debouncing)技术,减少事件处理程序的执行次数,提高性能。
  11. 选择合适的数据结构和算法: 在处理大量数据时,选择适当的数据结构和算法,以提高执行效率。例如,使用 Set 替代 Array 来进行快速查找。
  12. 精简库和框架: 仅引入项目所需的库和框架,避免引入过多不必要的代码。可以使用轻量级的替代方案或按需引入模块。

从工程方面来说

  1. 代码分割(Code Splitting): 将代码分割成小块,只加载当前页面需要的代码。这可以通过工具如Webpack的动态导入(Dynamic Import)或使用 import() 实现。
  2. 模块化开发: 采用模块化的开发方式,将代码划分成独立的模块。使用 ES6 模块化或 CommonJS 规范,以便更好地管理和维护代码。
  3. 资源压缩和合并: 压缩和合并 CSS、JavaScript 文件,减小文件大小,提高加载速度。可以使用工具如Webpack、Parcel等进行自动化处理。
  4. 使用合适的图片格式: 根据场景选择合适的图片格式,如 WebP、JPEG、PNG。使用适当的压缩工具,如 ImageOptim 或 TinyPNG。
  5. 优化字体加载: 仅加载项目所需的字体文件,使用 font-display 属性来控制字体的显示方式。尽量减少字体文件的大小。
  6. 使用服务端渲染(SSR)或预渲染(Prerendering): 对于单页面应用(SPA),考虑使用服务端渲染或预渲染技术,以提高首屏加载速度。
  7. 缓存策略: 配置合适的缓存策略,利用浏览器缓存机制。确保静态资源能够被正确地缓存,减少重复加载。
  8. 按需加载第三方库: 仅在需要时加载第三方库,避免将整个库包含在主文件中。可以使用按需加载的 CDN 或者使用工具按需引入库的部分功能。
  9. 静态资源版本管理: 在静态资源文件名中添加版本号或哈希值,确保浏览器在文件更新时能够正确地加载最新版本,避免缓存问题。
  10. 代码审查和性能测试: 定期进行代码审查,查找并解决潜在的性能问题。使用性能测试工具,如 Lighthouse、PageSpeed Insights 等,获取详细的性能报告。
  11. 优化构建过程: 针对具体项目,优化构建过程,包括压缩、打包、混淆等步骤。确保构建过程能够在合理的时间内完成。
  12. 使用 Tree Shaking: 对于支持 ES6 模块的环境,使用 Tree Shaking 来剔除未使用的代码,减小最终打包文件的大小。

从计算机网络方面来说

  1. 减少 HTTP 请求次数: 合并和压缩 CSS、JavaScript 文件,使用 CSS Sprites 合并小图标,减少页面加载所需的资源数量。
  2. 使用 CDN(内容分发网络): 将静态资源部署到 CDN 上,使用户可以从离他们更近的位置加载资源,减少网络传输时间和延迟。
  3. 启用 Gzip 压缩: 服务器启用 Gzip 压缩可以减小传输的文件大小,提高页面加载速度。大多数现代的 Web 服务器都支持 Gzip。
  4. 使用缓存机制: 使用适当的缓存策略,确保静态资源能够被浏览器缓存。合理设置缓存头,例如使用长期缓存和版本化文件名。
  5. 优化图片加载: 使用适当的图片格式,根据情况选择合适的压缩率,使用懒加载技术,仅在图片即将进入用户视野时加载。
  6. 使用 HTTP/2 协议: HTTP/2 支持多路复用,允许多个请求同时传输,减小了请求延迟。许多现代浏览器和服务器已经支持 HTTP/2。
  7. DNS 预解析: 使用 dns-prefetch 来指定需要预解析的域名,减少域名解析的时间。这对于第三方服务或 CDN 特别有用。
  8. 延迟加载: 对于不是首次必须加载的资源,使用异步加载或延迟加载的技术,以提高初始页面加载速度。
  9. 使用 WebP 图片格式: WebP 是一种高效的图片格式,可以提供更小的文件大小和更好的图像质量。适当的使用 WebP 格式可以减少图片的加载时间。
  10. 避免重定向: 避免不必要的重定向,每个重定向都会增加一次网络往返。确保页面的 URL 设计是直接指向最终目标。
  11. 减少请求的响应时间: 通过优化服务器端的响应时间,确保服务器迅速响应请求,减少客户端等待时间。
  12. 使用可靠的网络连接: 通过使用可靠的网络连接,如使用 HTTPS 协议,确保数据传输的安全性和完整性。
  13. 避免阻塞渲染: 尽量将 JavaScript 文件放在页面底部,减少对渲染的阻塞。使用 asyncdefer 属性来异步加载脚本。

从vue方面来说

  1. 合理使用 v-ifv-show 在需要频繁切换的情况下,使用 v-show 更合适,因为它只是切换 CSS 属性,而不是重新渲染整个组件。

  2. 使用 key 管理组件状态: 在使用 v-for 渲染列表时,为每个项添加唯一的 key,以便 Vue 可以更有效地跟踪每个组件的状态。

  3. 使用懒加载(异步组件): 对于大型页面或组件,可以使用 Vue 的异步组件,实现按需加载,提高初始加载速度。

  4. 使用 v-once 对于静态内容或不需要重新渲染的组件,可以使用 v-once 避免不必要的更新。

  5. 合理使用计算属性和监听器: 使用计算属性来处理复杂的逻辑,避免在模板中直接进行复杂的计算。同时,合理使用 watch 来监听数据变化,但不要滥用,以免影响性能。

  6. 合理使用 keep-alive 对于频繁切换的组件,可以使用 keep-alive 缓存组件的状态,避免重复创建和销毁。

  7. 使用 虚拟 DOM,避免直接操作 DOM: Vue.js 的核心特性之一是 虚拟 DOM,它能够优化 DOM 操作,最小化实际 DOM 的更新次数,避免直接操作 DOM,这有助于 Vue 更好地进行状态管理。

  8. 按需引入组件: 在使用 UI 框架时,按需引入组件,避免一次性引入整个框架,减小打包体积。

  9. 合理使用生命周期函数 : 合理使用 Vue 的生命周期函数,确保在正确的生命周期阶段执行需要的操作,避免不必要的计算和渲染。

  10. 减小数据量: 当传递数据给组件时,确保只传递组件实际需要的数据,避免不必要的数据传递和处理。

  11. 使用 v-cloak 防止闪烁: 当 Vue 实例挂载之前,防止页面出现未编译的 Vue 模板,可以使用 v-cloak 来隐藏未编译的内容。