如何在Nuxt中高效加载谷歌字体

问题描述 投票:0回答:2

我正在使用这个谷歌字体

font-family: 'Saira Semi Condensed', sans-serif;

链接:https://fonts.google.com/specimen/Saira+Semi+Condensed

我正在从事 NuxtJS 项目。我必须在两个不同的组件中使用这种字体,但具有不同的字体粗细。我已经导入了

Layout.vue
中的所有谷歌字体链接。

对于组件 A,

font-weight
600
,对于组件 B,
font-weight
800
。所以我认为在相应的组件中给出不同的字体粗细会起作用。但它不起作用。应用了唯一的基本字体,即
Saira Semi Condensed, sans-serif;
,但未反映字体粗细值。为了解决这个问题,我需要在
Layout.vue
中导入两个具有相同字体但不同字体粗细的谷歌字体链接,这使得它变得多余。

对于字体粗细:600

@import url('https://fonts.googleapis.com/css2?family=Saira+Semi+Condensed:wght@600&display=swap%27);

对于字体粗细:800

@import url('https://fonts.googleapis.com/css2?family=Saira+Semi+Condensed:wght@800&display=swap%27);

我认为我导入相同字体的两个链接的方式看起来不太好。你们能帮我解决这个问题吗? 提前谢谢您。

代码

布局.vue

<template>
  <div>
    <Nuxt />
  </div>
</template>

<style>
@import url('https://fonts.googleapis.com/css2?family=Nunito&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Saira+Semi+Condensed:wght@600&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Saira+Semi+Condensed:wght@800&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@700&display=swap');

html {
  font-family: 'Source Sans Pro', -apple-system, BlinkMacSystemFont, 'Segoe UI',
    Roboto, 'Helvetica Neue', Arial, sans-serif;
  font-size: 16px;
  word-spacing: 1px;
  -ms-text-size-adjust: 100%;
  -webkit-text-size-adjust: 100%;
  -moz-osx-font-smoothing: grayscale;
  -webkit-font-smoothing: antialiased;
  box-sizing: border-box;
}

*,
*::before,
*::after {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}
</style>

index.vue

<template>
  <div>
    <Navbar />
    <ComponentA />
    <ComponentB />
    <Footer />
  </div>
</template>

<script>
import Navbar from '../components/Navbar.vue'
import Clock from '../components/ComponentA.vue'
import Days from '../components/ComponentB.vue'
import Footer from '../components/Footer.vue'
export default {
  components: {
    Navbar,
    ComponentA,
    ComponentB,
    Footer,
  },
}
</script>

组件A.vue

<template>
  <div>
    <h1>I am component A</h1>
  </div>
</template>

<script>
export default {
  name: 'ComponentA',
}
</script>

<style scoped>
footer {
    color: blue;
    font-family: 'Saira Semi Condensed', sans-serif;
    font-size: 20px;
    text-align: center;
 }
</style>

组件B.vue

<template>
  <div>
    <h1>I am component B</h1>
  </div>
</template>

<script>
export default {
  name: 'ComponentB',
}
</script>

<style scoped>
footer {
    color: red;
    font-family: 'Saira Semi Condensed', sans-serif;
    font-size: 24px;
    text-align: center;
 }
</style>
css vue.js vuejs2 nuxt.js google-fonts
2个回答
12
投票

您正在从 CDN 加载字体,这不是推荐的做法。

这里引用了 Vitaly Friedman 撰写的 2021 年出色绩效检查表

现在,我们中的许多人可能正在使用 CDN 或第三方主机来加载网络字体。一般来说,如果可以的话,最好自行托管所有静态资源,因此请考虑使用 google-webfonts-helper,这是一种自行托管 Google Fonts 的无忧方式。如果不可能,您也许可以通过页面源代理 Google 字体文件。

看到这里,我确实推荐使用

@nuxtjs/google-fonts

,这是一个很酷的Nuxt模块。

我实际上已经问过我的模块配置是否正确,这是github问题:

https://github.com/nuxt-community/google-fonts-module/issues/26

这里是

nuxt.config.js

 中的用法示例

export default { buildModules: [ [ '@nuxtjs/google-fonts', { families: { Mali: { wght: [400, 600, 700], }, }, subsets: ['latin'], display: 'swap', prefetch: false, preconnect: false, preload: false, download: true, base64: false, }, ], ] }
当然也不要忘记处理 

@font-face CSS 方面


PS:如果您遇到

特定权重未下载的问题,您可以在模块配置中使用overwriting: true

或将包版本升级到v3.0.0-1
    


0
投票
@kissu 之前的精彩回答的更新。

截至 2024 年,最佳选择是使用

Nuxt Fonts,这是一个官方维护的 Nuxt 插件,它将:

    自动检测
  1. font-family
    使用
  2. 确定合适的提供商并
  3. 在构建时下载资产,以便可以通过您自己的域将其用作静态资产
如果您想知道失去跨域缓存(例如从谷歌字体提供服务)与自己提供资产的好处,

这篇文章很好地解释了为什么这不像听起来那么划算它将是(向下滚动到跨域缓存部分)。

© www.soinside.com 2019 - 2024. All rights reserved.