javascript - 使用 NextJS 的自托管字体

标签 javascript reactjs next.js webfonts web-performance

我正在尝试使用我的 NextJS 应用程序自托管 webfonts,但遇到了麻烦。
这是 URL 浏览器尝试访问这些字体:

localhost:3000/_next/static/css/fonts/Avenir.woff2
实际路径是:
_project_dir/static/fonts/Avenir.woff2
我尝试在 _app.js 中包含链接,它确实下载了字体,但文本仍然没有样式。
<link rel="preload" as="font" href="/static/fonts/Avenir.woff2" type="font/woff2" crossorigin />
这是我的_app.js :

  render() {
    const { Component, pageProps } = this.props;
    return (
      <Container>
        <link href="https://fonts.googleapis.com/css?family=Poppins:500,500i,600&display=swap" rel="stylesheet" />
        <link rel="preload" as="font" href="/static/fonts/Avenir.woff2" type="font/woff2" crossorigin />
        <link rel="preload" as="font" href="/static/fonts/AvenirHeavy.woff2" type="font/woff2" crossorigin />
        <Head>
          <title>Project</title>
        </Head>
        <Provider store={store}>
          <PersistGate loading={null} persistor={persistor}>
            <Component pageContext={this.pageContext} {...pageProps} />
          </PersistGate>
        </Provider>
      </Container>
    );
  }
}
我的 main.css
@font-face {
  font-family: 'Avenir';
  font-weight: 400;
  font-style: normal;
  font-display: swap;
  src: url('fonts/Avenir.eot');
  src: url('fonts/Avenir.eot?#iefix') format('embedded-opentype'), url('fonts/Avenir.woff2') format('woff2'),
    url('fonts/Avenir.woff') format('woff'), url('fonts/Avenir.ttf') format('truetype');
}

@font-face {
  font-family: 'Avenir';
  font-weight: 500;
  src: url('fonts/Avenir.eot');
  src: url('fonts/Avenir.eot?#iefix') format('embedded-opentype'), url('fonts/Avenir.woff2') format('woff2'),
    url('fonts/Avenir.woff') format('woff'), url('fonts/Avenir.ttf') format('truetype');
}

@font-face {
  font-family: 'Avenir';
  font-weight: 900;
  src: url('fonts/AvenirHeavy.eot');
  src: url('fonts/AvenirHeavy.eot?#iefix') format('embedded-opentype'), url('fonts/AvenirHeavy.woff2') format('woff2'),
    url('fonts/AvenirHeavy.woff') format('woff'), url('fonts/AvenirHeavy.ttf') format('truetype');
}

还有我的next.config.js :
  webpack(config, options) {
    config.module.rules.push({
      test: /\.(png|jpg|gif|svg|eot|ttf|woff|woff2)$/,
      use: {
        loader: 'url-loader',
        options: {
          limit: 100000,
        },
      },
    });
    return config;
  },

最佳答案

你不需要任何额外的依赖来使用字体。只需将您的字体移至 public/fonts而不是 static/fonts .
然后预加载:

<link rel="preload" href="/fonts/Avenir.woff2" as="font" type="font/woff2" crossOrigin="anonymous" />
记得保留开头的斜线,否则将不起作用。根据official docs :

Files inside public can then be referenced by your code starting from the base URL (/).


此外,在 JSX 中,它是 crossOrigin不是 crossorigin , 它期望 string ,而不是 Boolean .
在 CSS/SCSS 中(在每个 src-url 中添加斜杠):
@font-face {
  /* ... */
  src: url('/fonts/Avenir.woff2') format('woff2');
  /* ... */
}
然后删除字体文件的自定义 webpack 配置。这种方法的缺点是字体不会像 url-loader 那样被内联。 .但是我相信无论如何内联所有字体都是非常低效的。 (您设置了 100000 的限制。几乎所有 woff/woff2 字体都会被内联。)

关于javascript - 使用 NextJS 的自托管字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57590195/

相关文章:

javascript - react 测试库 : Unable to Change Material UI DatePicker Input Value

javascript - 无法在 React js 中获取 `props` - 下一个 js 应用程序

next.js - NextJS 错误 - HookWebpackError : Expected a pseudo-class or pseudo-element

javascript - 精细上传到 S3 文件夹

javascript - 命名 AngularJS 模块的常用方法?

javascript - 转义字符无法在 ReactJS map 循环中工作

next.js - NextJS 的 getServerSideProps 中的 Apollo 查询?

javascript - 检查值是否是 JavaScript 中的符号

javascript - (覆盖 || 扩展)Javascript 方法

javascript - 如何将图像数据响应转换为 Image base64?