如何对同一个标签同时使用 rel="preload" 和 rel="stylesheet"?

How to use both rel="preload" and rel="stylesheet" for the same tag?

Google Pagespeed 测试在与样式表一起使用时无法识别预加载。我试过了

<link rel="preload stylesheet" href="http://www.example.com/style.css" />

而且它仍然显示 "Consider using to prioritize fetching resources that are currently requested later in page load."。如果我从 rel 属性中删除样式表,它会识别预加载。

我想试试这个:

<link rel="preload" rel="stylesheet" href="http://www.example.com/style.css" />

但我不确定您是否可以为同一个 link 标签设置 2 个相同的属性。这行得通吗?

对于异步加载 CSS 样式,您应该指出它,作为预加载样式表每当您单独使用 rel="preload" 时,它不会在页面加载时转换为样式表,它将保持为 preload,因此要将其指示为您应该使用的样式表另一个属性,例如 as,它 表示元素的类型,在您的情况下,它应该是 style。然后你需要在加载过程完成时告诉浏览器你需要将其视为样式表,因此你必须定义另一个属性,如onload,然后定义其真正的关系.

所以你必须像这样导入它:

<link rel="preload" as="style" onload="this.rel='stylesheet'" href="http://www.example.com/style.css">

注意: 您可以在 google 开发人员中阅读更多相关信息 here

更新

由于 preload 直到现在才在 firefox 中得到支持(根据 this),唯一的方法是声明它两次在一个 rel 标签或两个单独的标签中。

<link rel="preload" as="style" href="http://www.example.com/style.css">
<link rel="stylesheet" href="http://www.example.com/style.css">

<link rel="stylesheet" rel="preload" as="style" href="http://www.example.com/style.css">

注意: 由于@JohnyFree 测试了第二个 (有一条线穿过) Google 页面速度, 它不会被识别为有效的 preload 样式,而格式根据 W3.org.

有效

预加载https://web.dev/defer-non-critical-css/

<link rel="preload" as="style" onload="this.onload=null;this.rel='stylesheet'" href="http://www.example.com/style.css"/>

不支持的浏览器回退https://www.filamentgroup.com/lab/load-css-simpler

<link rel="stylesheet" media="print" onload="this.media='all'" href="http://www.example.com/style.css"/>

Firefox 据说在 85 版本中启用了“预加载”,但它似乎无法正常工作。我发现以下代码有效:

<link rel="preload stylesheet" as="style" href="style.css">

如果你觉得你需要这样做Javascript马戏团的把戏来节省几百毫秒,我推荐下面的版本。如果你想要 cross-browser 支持,请改用它:

<link media="print" onload="this.media='all'" rel="stylesheet" type="text/css" href="style.css" />

为什么这行得通?在几乎所有可追溯到 1990 年代的浏览器中,都普遍支持链接的“打印”媒体类型样式 sheet。链接的打印样式 sheet 仅在打印页面时使用。因为浏览器知道“sheet”媒体类型必须始终在“print”之前下载,所以它们经常延迟或异步下载带有“media=print”的sheets。页面作者不需要任何东西。自然地,它在大多数浏览器中以这种方式工作了很多年。

最近,试图遵循 Google 的新排名政策的开发人员发现了这个技巧,可以阻止某些样式阻止其他样式或立即下载。然后他们意识到“打印”媒体类型是唯一 built-in、cross-browser 欺骗浏览器延迟下载样式 sheets.

的方法

使用上面的技巧将您的样式 sheet 变成“印刷”类型并不意味着它是“印刷”,因为稍后脚本会将其改回“全部”。它只是一种“黑客”或阻止现代浏览器与其他 sheet 并行下载您的 CSS 样式的方法。

注意:包括 Internet Explorer 版本 1-7 在内的大量旧版浏览器不支持“all”,无论如何,这是个坏主意。

阻止一种或两种风格 sheet 阻止另一种 sheet 下载是使用此技巧的唯一原因,并假设您使用的是一种巨大的风格 sheet大小超过 50 KB,并使用连接速度较慢的服务器。

建议?

我建议您永远不要“预加载”CSS,原因如下!

  1. 只是因为 Google 将此标记为 Lightspeed 中的一个问题,并不意味着用重复的样式链接填充您的网页并精心设计 JavaScript 技巧以缩短 100 毫秒是个好主意. 您应该更关心 HTML 页面的质量和完整性,而不是其他所有问题,包括速度或 advertising-driven 搜索引擎需求!
  2. 可能存在赛车问题!当您的 HTML 在您的异步“打印”sheet 自行解析回“全部”之前下载时会发生什么?您可能会在某些浏览器中看到闪烁,其中 HTML 首先下载并在下载异步样式之前开始渲染。然后您的用户会看到您的网站布局和字体移动或移动。恶心!!
  3. Async'ing CSS 与孩子们在 2021 年下载的这些设计糟糕的 Javascript 框架相比有点毫无意义,无论如何都会浪费下载时间。大多数样式 sheet 的大小为 50 KB 或更小,相比之下,当今最现代的 Javascript 框架(即 React、Angular、Ember,等等)。无论如何,这些下载经常将相同的 CSS 一遍又一遍地“嵌入”到浏览器的缓存中,强制重新加载相同的 CSS 每次站点访问,这与 CSS 可以缓存数月的链接样式不同!因此,如果每次访问都重新加载,预加载链接 CSS 是没有意义的。那有什么意义呢?
  4. 许多浏览器可能会因为这个技巧而崩溃和烧毁! preload 无论如何都没有被广泛采用,所以你 运行 在一定比例的用户中面临着巨大的风险 如果您使用此“hack”,则会看到一个无样式的网站。想象一下,有 5%-10% 的用户看到您的网站以默认 'Times Roman' 字体和白色 block-level 无样式内容页面显示,因为您想节省 500 毫秒的下载时间?抱歉,不值得冒险!
  5. 大多数旧浏览器在下载文件时只允许打开 2 个连接,因此它们受到打开连接的限制,而不是样式 sheet 下载。许多现代浏览器最多有 6 个。因此,再次强调,当与多个打开的 JavaScript 调用相结合时,连接是这里的瓶颈,而不是样式 sheet 下载。使用此技巧收效甚微。
  6. 缓慢的服务器通常是真正的瓶颈:服务器在打开连接时的延迟可能是巨大的瓶颈。即使您的主机提供商或 Wordpress 之类的 Web 应用程序正在使用缓存的图像、页面和代理,但您等待数百毫秒才能在服务器上打开连接,这一切都变得毫无意义。 CDN 也可能会失败、延迟、阻塞等。
  7. 除了缓慢的服务器和巨大的 JavaScript API 库之外,延迟下载的第一大因素通常是 巨大的图像文件 。考虑使用具有多种图像类型的新 HTML5 'picture' 元素,例如高度压缩的“WebP”。如果您的页面有“on-demand”、non-streaming 视频,那也必须设置为异步预加载或下载。添加“宽度”和“高度”值以强制 'alt' 属性 paceholders,因为图片下载会在您的页面布局中创建保留尺寸,因此它们不会转移等待下载的图片。当您专注于图像和媒体问题而不是 CSS。
  8. 时,您会惊讶于下载时间的节省和瓶颈的避免

所有这些使得预加载 CSS 就网站改进而言毫无价值。我会查看浏览器中堆积的多个 Bootstrap、JavaScript 模块和 JQuery 文件下载,以获取有限的共享浏览器连接并关注较少的脚本。 30 KB 左右的 CSS 可能不是问题。