CSS 面试题 目录

请描述你对 CSS 预加载和预获取的理解,以及如何使用 link 标签的 rel 属性实现预加载和预获取。

推荐答案

CSS 的预加载(preload)和预获取(prefetch)是浏览器性能优化的重要技术,它们允许我们提前告知浏览器需要下载的资源,从而优化页面加载速度。

预加载 (preload)

  • 目的:告诉浏览器资源是当前页面渲染所需的关键资源,应该尽快下载,并且在需要时立即使用。
  • 行为:浏览器会像对待关键资源一样,立即下载资源,并根据资源类型进行相应的处理。例如,对于字体文件会进行解码,对于图片则可以进行缓存。
  • 使用场景:关键的CSS,JavaScript,字体,图片等,这些资源在当前页面渲染时是必须的,并且需要尽早加载。
  • 实现方式:使用 <link rel="preload" href="resource.url" as="resource-type"> 标签。
    • href:指定需要预加载的资源 URL。
    • as:指定资源的类型,例如:style, script, font, image 等,这对浏览器正确处理资源至关重要。
    • 还可以添加 crossorigin 属性处理跨域资源, 以及 type 属性处理资源类型。

预获取 (prefetch)

  • 目的:告诉浏览器这个资源可能在未来的页面浏览中需要,可以提前下载,但优先级较低,不阻塞当前页面的渲染。
  • 行为:浏览器会在空闲时间下载资源,并存储在缓存中,当用户导航到下一个页面,并且需要使用到该资源时,可以直接从缓存中获取,从而提高页面加载速度。
  • 使用场景:下一个或下几个页面可能需要的资源,例如,下一个页面的CSS/JS/图片资源,或者用户点击按钮/链接后才可能需要的资源。
  • 实现方式:使用 <link rel="prefetch" href="resource.url"> 标签。
    • href:指定需要预获取的资源 URL。
    • 还可以添加 crossorigin 属性处理跨域资源。

总结区别

预加载注重“当前”页面,预获取注重“未来”页面。预加载优先级高,立即下载,预获取优先级低,空闲时间下载。

本题详细解读

预加载 (preload) 的详细解读

为什么要使用 preload?

浏览器默认会解析 HTML 文档,并按顺序下载资源,这个过程会存在一定的延迟,尤其是在资源非常多或者资源比较慢的情况下。preload 允许开发者告诉浏览器哪些资源是当前页面渲染的必需品,让浏览器提前开始下载这些资源,而不必等到浏览器解析到它们时才开始下载。这可以大大优化首屏渲染时间,特别是当页面需要加载字体、较大的背景图片或者某些关键的脚本或样式时。

link 标签的 rel="preload" 的属性详解

  • href 属性: 指定要预加载的资源的 URL。
  • as 属性:
    • as 属性非常重要,它指定了预加载资源的类型,浏览器会根据这个属性来决定如何下载、解析和使用资源。
    • 如果 as 属性没有正确指定,可能会导致资源下载失败或者无法使用。
    • 常用的取值包括: style (CSS), script (JavaScript), font (字体文件), image (图片), audio (音频文件), video (视频文件), fetch (通过Fetch API获取的资源), document (HTML文档)等。
  • type 属性:
    • type属性用于指定资源的MIME类型,对于某些资源类型(如字体),浏览器可能会使用type属性来决定是否下载资源。
    • 例如,对于font类型的预加载,可以使用 type="font/woff2" 指定字体文件类型。
  • crossorigin 属性:
    • 当你预加载跨域资源时,crossorigin 属性是必需的。
    • 如果你加载的跨域资源需要身份验证,则需要设置 crossorigin="use-credentials"

preload 使用示例

预获取 (prefetch) 的详细解读

为什么要使用 prefetch?

预获取的主要目的是改善用户体验,当用户在网站上进行导航时,如果下一个页面所需的资源已经被提前缓存,那么页面的加载速度会显著提升。这对于单页面应用 (SPA) 或具有复杂导航的网站尤为重要。prefetch 不会阻塞当前页面的加载,并且只有在浏览器空闲时才会下载资源,所以不会影响当前页面的渲染性能。

link 标签的 rel="prefetch" 的属性详解

  • href 属性: 指定要预获取的资源的 URL。
  • crossorigin 属性: 如果预获取跨域资源,也可能需要添加 crossorigin 属性。

prefetch 使用示例

注意事项

  • 正确使用 as 属性: as 属性对于 preload 标签至关重要,务必正确设置,否则可能会导致资源加载失败或浏览器不正确处理。
  • 避免过度使用预加载: 过多的预加载可能会导致资源竞争,反而影响页面加载速度。只预加载关键资源。
  • 服务器端支持: 服务器端需要正确配置资源的文件头,例如,对于字体文件,需要设置合适的 Access-Control-Allow-Origin 头,才能确保跨域预加载的正常进行。
  • 资源缓存: 预加载和预获取的资源都会被浏览器缓存,确保浏览器在需要时能快速从缓存中获取,可以使用cache-control头控制缓存策略。
  • 使用场景: 预加载适用于当前页面需要的关键资源,预获取适用于未来页面需要的资源。
纠错
反馈