面试题之如何进行网站性能优化

160 阅读6分钟

前言

在面试过程中,面试官可能会询问你有关性能优化之类的问题,毕竟会性能优化对于程序员是至关重要的,因为它直接关系到用户体验、搜索引擎排名、业务效益等多个方面。

为什么要进行网络性能优化

  1. 提升用户体验: 用户期望快速加载的网页,延迟的页面加载会降低用户满意度。通过性能优化,可以提高网站的加载速度,提升用户体验,增加用户留存和参与度。
  2. 减少跳失率: 慢速的网页加载可能导致用户放弃等待,增加网站的跳失率。通过降低加载时间,可以减少用户流失,提高网站的留存率。
  3. 提高搜索引擎排名: 搜索引擎对网站的加载速度有一定的考虑因素,较慢的网页可能在搜索结果中排名较低。通过性能优化,可以提高网站在搜索引擎中的可见性和排名。
  4. 降低服务器负载: 优化网站性能有助于降低服务器负载,减少对服务器资源的需求。这可以降低服务器运营成本,并提高整个网站的稳定性和可靠性。
  5. 提高移动设备用户体验: 移动设备上的用户对网页速度和性能有更高的期望,而且网络速度可能不如在桌面上快。通过性能优化,确保网站在移动设备上具有良好的性能,提高移动用户体验。
  6. 节约带宽成本: 优化网站性能有助于减少数据传输量,降低带宽使用成本。这对于大流量的网站来说尤为重要。

因此进行网络性能优化是十分重要的。

如何进行网络性能优化

1. Content 方面:

减少 HTTP 请求:

  • 合并文件: 将多个CSS或JavaScript文件合并成一个,减少文件请求次数。例如:

    <!-- 优化前 -->
    <link rel="stylesheet" href="style1.css">
    <link rel="stylesheet" href="style2.css">
    
    <!-- 优化后 -->
    <link rel="stylesheet" href="combined-styles.css">
    
  • CSS 精灵: 将多个小图标合并为一张精灵图,通过CSS background定位来显示不同图标。例如:

    /* 优化前  */
    .icon1 {
      background-image: url('icon1.png');
    }
    
    .icon2 {
      background-image: url('icon2.png');
    }
    
    /* 优化后 */
    .icon {
      background-image: url('sprites.png');
    }
    
  • Inline Image: 将小图或背景图以base64编码的方式嵌入CSS文件中,减少对服务器的请求。例如:

    /* 优化前 */
    .background {
      background-image: url('background.jpg');
    }
    
    /* 优化后 */
    .background {
      background-image: url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAAAAAAAD/4QA...'); /* Base64 encoded image */
    }
    

减少 DNS 查询:

  • DNS 缓存: 通过适当设置DNS缓存时间,减少DNS查询的频率。
  • 资源分布到恰当数量的主机名: 将资源文件(如图片、CSS、JavaScript)分布到不同的主机名上,以提高并行加载效率。

减少 DOM 元素数量:

  • 通过合理的HTML结构和CSS样式,尽量减少页面中的DOM元素数量,减轻浏览器渲染负担。

2. Server 方面:

使用 CDN:

  • 利用内容分发网络(CDN)将静态资源部署到离用户更近的服务器,提高资源加载速度。例如:
    <!-- 优化前 -->
    <script src="https://example.com/scripts/script.js"></script>
    
    <!-- 优化后 -->
    <script src="https://cdn.example.com/scripts/script.js"></script>
    

配置 ETag:

  • 启用ETag,确保浏览器可以使用缓存而不必每次都重新请求资源。

对组件使用 Gzip 压缩:

  • 在服务器端启用Gzip压缩,减小传输文件大小,提高加载速度。

3. Cookie 方面:

减小 cookie 大小:

  • 仅保留必要的信息,减小cookie的大小,降低每次请求的负担。

4. CSS 方面:

将样式表放到页面顶部:

  • 将CSS文件放在页面头部,确保在页面加载时样式能够尽早生效,避免页面闪烁。

不使用 CSS 表达式:

  • 避免使用CSS表达式,因为CSS 表达式会在每次页面重绘时都被重新计算,因此会影响页面的性能。特别是在包含大量元素的页面上,这些表达式的计算可能会导致性能下降,延长页面加载时间。

使用 <link> 不使用 @import:

  • 并行加载: <link> 允许多个资源并行加载,而 @import 是在主样式表加载完成后才开始加载导入的样式表。
  • 页面渲染时机: <link> 的样式表在页面渲染之前加载,避免了页面加载时的样式闪烁(FOUC)。
  • 兼容性: <link> 在各种浏览器中支持更为稳定,而 @import 可能存在兼容性问题。
  • JavaScript 访问性: <link> 允许 JavaScript 直接访问样式表对象,而 @import 需要通过遍历文档查找。
  • 权重问题: <link> 的样式表权重较高,更容易覆盖其他样式,提供更精确的样式控制。
  • 异步加载: <link> 可以使用 asyncdefer 属性实现异步加载样式表,有助于提高性能。
  • 模块化: <link> 支持模块化加载,通过 type="module" 属性实现更好的样式组织和管理。

5. JavaScript 方面:

将脚本放到页面底部:

  • 将JavaScript文件放在页面底部,确保页面内容在加载时先显示,提高用户体验。

将 JavaScript 和 CSS 从外部引入:

  • 避免将JavaScript和CSS代码直接写在HTML文件中,使用外部文件进行引入,方便缓存和复用。

压缩 JavaScript 和 CSS:

  • 使用压缩工具对JavaScript和CSS进行压缩,减小文件大小,提高加载速度。

删除不需要的脚本:

  • 审查并删除不必要的JavaScript文件,减轻页面负担,提高加载速度。

减少 DOM 访问:

  • 减少JavaScript对DOM的频繁访问,通过缓存DOM查询结果以及使用批量操作来提高性能。

6. 图片方面:

优化图片:

  • 选择色深: 根据实际需要选择适当的色深,减小图片文件大小。
  • 压缩: 使用合适的工具对图片进行压缩,保持视觉质量的同时减小文件大小。

优化 CSS 精灵:

  • 将相近的小图标合并到CSS精灵中,减少HTTP请求,提高加载速度。

不要在 HTML 中拉伸图片:

  • 避免在HTML中使用宽高属性拉伸图片,而是通过CSS样式来控制图片的显示大小,保持原图比例。

结语

总的来说,网络性能优化是一个综合考虑多个方面的复杂任务,需要持续关注和不断调整。通过合理应用上述优化策略,我们可以为用户提供更快速、更流畅的访问体验。学会如何进行网络性能优化对于我们后面的工作也会有着较大的帮助。