浏览器无法使用@font-face获取woff字体文件

Browser cannot get woff font file using @font-face

对于我的服务器,我希望启用动态加载字体。服务器运行 nestjs

我将 .woff 文件托管在服务器上名为 'fonts' 的目录中。

@font-face 是在 html 头部部分的样式标签中动态构建的(根据所需字体)。

但是,当我将 url 设置为文件路径时,如下所示:

@font-face {
      font-family: Roboto;
      src: url(fonts/roboto-v29-latin-regular.woff);
    }

然后 GET 以 404 not found 结束。

当我只使用文件名时:

@font-face {
          font-family: Roboto;
          src: url(roboto-v29-latin-regular.woff);
        }

然后返回一个空对象{}

非常感谢您的见解!

有几个解决方案可能是潜在的修复方法,具体取决于您如何处理 CSS 文件。

如果 roboto-v29-latin-regular.woff 文件在 fonts 文件夹中,这意味着 CSS 尝试在本地目录中查找路径。要在本地目录中查找某些内容,请在斜杠 ( ./ ) 前面使用点。所以如果我们有以下目录:

/fonts
 -roboto-v29-latin-regular.woff
styles.css

那么 roboto-v29-latin-regular.woff 的路径将是 ./fonts/roboto-v29-latin-regular.woff 并且会导致以下字体:

@font-face {
  font-family: Roboto;
  src: url(./fonts/roboto-v29-latin-regular.woff);
}

这是您可以轻松访问本地或高于当前级别的目录的方法。阅读 this.

但是,如果您以不同的方式处理 CSS,您只需在 fonts 文件夹前提供一个 /,这将由从本地实例服务器获取字体 URL:

/* Imagine your URL to be: http://localhost:3000/fonts/roboto-v29-latin-regular.woff */

@font-face {
  font-family: Roboto;
  src: url(/fonts/roboto-v29-latin-regular.woff);
}

同样,如果上述解决方案 none 有效,只需将字体放在外部 URL(来自 google 字体等)


@font-face {
  font-family: Roboto;
  src: url(<EXTERNAL_URL>);
}

问题是 nestjs 没有提供字体文件。 我必须使用 ServeStaticModule.forRoot:

从 appModule 静态地为它们提供服务
@Module({
  imports: [
    ServeStaticModule.forRoot({
      rootPath: join(__dirname, '..', 'fonts'),
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})

然后将我的fonts文件夹复制到dist目录。 这解决了问题。