我们如何在 Angular 中预加载字体?

How can we preload fonts in Angular?

提问人:ABHILASH SB 提问时间:1/13/2020 最后编辑:Hossein MousaviABHILASH SB 更新时间:9/4/2023 访问量:6380

问:

我们是否应该像下面的代码一样将字体包含在 index.html 文件中,或者我们可以在 Angular CLI 中配置它以预加载所需的所有字体?
请向我建议一个更好的解决方案,因为我可以看到谷歌分析中建议的页面加载时间需要数秒。
rel="preload"

<link rel="preload" href="./assets/fonts/Lato/Lato-Semibold.woff2" as="font" crossorigin>
<link rel="preload" href="./assets/fonts/Lato/Lato-Black.woff2" as="font" crossorigin>
<link rel="preload" href="./assets/fonts/Lato/Lato-Bold.woff2" as="font" crossorigin>
<link rel="preload" href="./assets/fonts/Lato/Lato-Heavy.woff2" as="font" crossorigin>
<link rel="preload" href="./assets/fonts/Lato/Lato-Medium.woff2" as="font" crossorigin>
<link rel="preload" href="./assets/fonts/Lato/Lato-Regular.woff2" as="font" crossorigin>
HTML Angular 字体 angular-cli 预加载

评论

1赞 Piyush Jain 1/13/2020
查看这些 URL,您可能会获得帮助。stackoverflow.com/questions/1330825/preloading-font-face-fonts stackoverflow.com/questions/42616709/......
0赞 Hossein Mousavi 2/6/2021
这回答了你的问题吗?预加载@font面字体?
1赞 Mike 'Pomax' Kamermans 12/12/2021
你可以得到更接近标准 HTML:即使你使用的框架有自己定制的做事方式,也要这样做。因为除非这些定制的解决方案被编译为“纯 HTML”,否则纯 HTML 解决方案始终是最好的解决方案。

答:

-2赞 Raheem Mohamed 3/7/2021 #1

对于 angular 中的这种实现,您应该使用第三方依赖项来加载字体。

使用 WebFontLoader

npm i webfontloader

之后,像这样加载您的自定义字体

 WebFont.load({
  custom: {
    families: [""Lato"]
  }
 });
0赞 Pushpinder Singh 9/11/2021 #2
  1. 预连接到字体文件源。
  2. 以低优先级异步预加载字体样式表。
  3. 在使用 JavaScript 呈现内容后,异步加载字体样式表和字体文件。
  4. 为关闭 JavaScript 的用户提供回退字体

例::

<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="preload" as="style" href="https://fonts.googleapis.com/css2family=Merriweather&display=swap" />
<link rel="stylesheet" href="https://fonts.googleapis.com/css2family=Merriweather&display=swap" media="print" onload="this.media='all'" />
<noscript>
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2family=Merriweather&display=swap" />
</noscript>

供您参考:链接到 Harry Roberts 关于字体加载的解释

-2赞 Mahima Sachdeva 12/16/2021 #3

对于 angular 中的这种实现,您应该使用第三方依赖项来加载字体,找到集中的、受信任的内容并围绕您最常用的技术进行协作,在一个结构化且易于搜索的位置连接和共享知识。 之后,像这样加载您的自定义字体

   WebFont.load({
              custom: {
                 families: [""
                    Lato "]
                 }
              });

评论

2赞 Sercan 12/16/2021
请阅读这篇文章以改进您的答案?
0赞 Somil Dubey 9/4/2023 #4

为每个字体文件包含多个预加载链接可能会使您的 html 文件膨胀并使其更难管理。

1. 您可以在 angular 中创建服务来处理字体预加载。这将允许灵活性。

2. 您还可以配置 angular.json 文件

"assets": [
    "src/favicon.ico",
    "src/assets",
    {
      "glob": "**/*",
      "input": "node_modules/@fortawesome/fontawesome-free/webfonts",
      "output": "/webfonts/"
    }
]

3. 如果您拥有的字体不是应用程序标准资产的一部分,则可以将服务用作

在 service.ts 中


import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root',
})
export class FontPreloadingService {
  preloadFonts(fontUrls: string[]) {
    fontUrls.forEach((url) => {
      const link = document.createElement('link');
      link.rel = 'preload';
      link.as = 'font';
      link.href = url;
      link.crossOrigin = 'anonymous';
      document.head.appendChild(link);
    });
  }
}

Preload the fonts in your component 

在 app.ts 中

import { Component, OnInit } from '@angular/core';
import { FontPreloadingService } from './font-preloading.service';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
})
export class AppComponent implements OnInit {
  constructor(private fontPreloadingService: FontPreloadingService) {}

  ngOnInit() {
    const fontUrls = [
      './assets/fonts/Lato/Lato-Semibold.woff2',
      './assets/fonts/Lato/Lato-Black.woff2',
      // Add other font URLs as needed
    ];

    this.fontPreloadingService.preloadFonts(fontUrls);
  }
}