谷歌字体加载过多

7

我只嵌入了来自Google Fonts的一种字体。这是嵌入代码:

 <link href="https://fonts.googleapis.com/css?family=Open+Sans&display=swap" rel="stylesheet"> 

但是,如果我查看网络监视器,会发现加载了3个字体元素和1个来自Google字体的CSS。这是我获取的字体列表:
Status  Method  Domain  File    Cause   Type    Transfered  Size

200 GET fonts.googleapis.com    css?family=Open+Sans&display=swap   stylesheet  css 557 B   2.53 KB
200 GET fonts.gstatic.com   mem8YaGs126MiZpBA-UFVZ0b.woff2  font    woff2   14.04 KB    14.04 KB
200 GET fonts.gstatic.com   mem8YaGs126MiZpBA-UFW50bbck.woff2   font    woff2   11.05 KB    11.05 KB
200 GET fonts.gstatic.com   mem8YaGs126MiZpBA-UFWp0bbck.woff2   font    woff2   5.89 KB 5.89 KB

除此之外,我在附加的CSS中有整个字体列表。
/* cyrillic-ext */
@font-face {
  font-family: 'Open Sans';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFWJ0bbck.woff2) format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
  font-family: 'Open Sans';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFUZ0bbck.woff2) format('woff2');
  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
  font-family: 'Open Sans';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFWZ0bbck.woff2) format('woff2');
  unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
  font-family: 'Open Sans';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFVp0bbck.woff2) format('woff2');
  unicode-range: U+0370-03FF;
}
/* vietnamese */
@font-face {
  font-family: 'Open Sans';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFWp0bbck.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Open Sans';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFW50bbck.woff2) format('woff2');
  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Open Sans';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFVZ0b.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}




为什么会这样?
1个回答

5
我只嵌入了一个来自Google Fonts的字体。这是嵌入代码: 这不正确,您嵌入了来自字体“家族”的多个字体和字符集。字体不是单一的东西:
- 字体家族(Arial)
- 字型(Arial Regular) - 字型(Arial Italic) - 字型(Arial Bold) - 字型(Arial Bold Italic)
每种字型都进一步分成包含不同字符集的子文件。
如果我们查看CSS文件,将加载多个字体。它们都实现Open Sans字体的不同部分,特别是不同的字符集:
- Open Sans cyrillic-ext - Open Sans cyrillic - Open Sans greek-ext - Open Sans greek - Open Sans vietnamese - Open Sans latin-ext - Open Sans latin
每个条目声明文件支持的Unicode字符范围。
例如,如果没有这个文件,越南语字符将无法显示。

https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFWp0bbck.woff2

如果没有这个文件,欧洲拉丁字符空间中的字符将无法呈现:

https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFVZ0b.woff2

同样,如果您选择了斜体、粗体、粗斜体等样式,每个样式都会添加一个文件。
最后,您没有告诉浏览器加载字体,而是告诉浏览器加载样式表,然后样式表加载字体,所以这是另一个额外的文件。
为什么不将它们捆绑成一个文件?
这样做并不能节省任何文件空间,而且在HTTP/1下可能加载得更慢,因为它无法并行传输。
但是,如果我只使用西里尔文编写网站,我真的需要字体中的越南语字符吗?通过仅选择要使用的脚本,您可以节省带宽并加速字体加载。这就是为什么Google为每个脚本提供了一个文件,而不是将所有内容捆绑成一个文件。
以这种方式传输许多小文件比传输单个大文件具有更好的性能,这要归功于HTTP/2。

我该如何仅加载单个字体而非整个字体家族,我只选择了-regular 400 和拉丁字母,所有其他语言和字重 - 样式选项均已取消勾选,但仍然有3个字体正在加载。 - Botond Vajna
我更新了我的答案,解释了为什么加载两种字体会加载三个文件。无论如何,我相信我已经回答了你的问题,那就是为什么会发生这种情况。如果是这样,请将我的答案标记为正确,您可以随时在stackoverflow上提出新的问题以进行后续提问。 - Tom J Nowell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接