fonts.googleapis.com替代方案

最近发现我的Hugo网站,在大陆访问有时候打开很慢,F12大法排查发现是打开网站有个请求到fonts.googleapis.com,是Hugo的主题会请求一些字体和图标。由于众所周知的原因,这个请求会严重影响加载速度,页面中的图标字体可能还无法显示。

解决这个问题,基本有2个思路,一个是找到google的代替网站,一个是把需要请求的内容放在网站本地。

1. 找到html

以我的Hugo主题Diary为例,在\themes\diary\layouts\partials\head.html里找到

<link rel="stylesheet"
          href="https://fonts.googleapis.com/css?family=Material+Icons">

2. 镜像网站代替

网上可以搜到很多国内google fonts的加速镜像,这种方法需要镜像网站本身要比较可靠,这里以loli.net为例。

把原内容

href="https://fonts.googleapis.com/css?family=Material+Icons">

修改为

href="https://fonts.loli.net/css?family=Material+Icons">

如果想用hugo的参数来控制使用google还是镜像网站,可以现在toml配置文件增加一个参数replaceGoogleFont。

[params]
replaceGoogleFont = true

然后在head.html里添加参数判断

{{ if .Site.Params.replaceGoogleFont }}
<link rel="stylesheet"
          href="https://fonts.loli.net/css?family=Material+Icons">
{{ else }}
<link rel="stylesheet"
          href="https://fonts.googleapis.com/css?family=Material+Icons">
{{ end }}

修改完测试后,正确请求了loli.net。

3. 本地文件

后来我发现loli.net的请求也不快,有时候要1秒多才返回。要更稳定的方法可以把请求内容下载到本地,不再需要发起网络请求。

先保存请求的css返回内容

curl https://fonts.googleapis.com/css?family=Material+Icons

@font-face {
  font-family: 'Material Icons';
  font-style: normal;
  font-weight: 400;
  src: url(https://fonts.gstatic.com/s/materialicons/v140/flUhRq6tzZclQEJ-Vdg-IuiaDsNZ.ttf) format('truetype');
}

.material-icons {
  font-family: 'Material Icons';
  font-weight: normal;
  font-style: normal;
  font-size: 24px;
  line-height: 1;
  letter-spacing: normal;
  text-transform: none;
  display: inline-block;
  white-space: nowrap;
  word-wrap: normal;
  direction: ltr;
}

将内容保存为css.css文件。发现文件内容里还有个url请求,把这个ttf字体文件也单独下载下来,保存为flUhRq6tzZclQEJ-Vdg-IuiaDsNZ.ttf。

修改css.css的内容,将原内容

@font-face {
  font-family: 'Material Icons';
  font-style: normal;
  font-weight: 400;
  src: url(https://fonts.gstatic.com/s/materialicons/v140/flUhRq6tzZclQEJ-Vdg-IuiaDsNZ.ttf) format('truetype');
}

修改为

@font-face {
  font-family: 'Material Icons';
  font-style: normal;
  font-weight: 400;
  src: url(flUhRq6tzZclQEJ-Vdg-IuiaDsNZ.ttf) format('truetype');
}

然后将css.css和flUhRq6tzZclQEJ-Vdg-IuiaDsNZ.ttf放在同一个文件夹里,这里放在/static/googlefont/下。

最后修改\themes\diary\layouts\partials\head.html文件。

把原内容

href="https://fonts.googleapis.com/css?family=Material+Icons">

修改为

href="/googlefont/css.css?family=Material+Icons">

修改完后测试正常。


Last modified on 2023-11-10