当前位置: 首页 > 面试题库 >

如何在基于create-react-app的项目中添加字体?

钮瀚
2023-03-14
问题内容

我正在使用create-react-app,但不喜欢eject

目前尚不清楚通过@ font-face导入并本地加载的字体应该放在哪里。

即我正在加载

@font-face {
  font-family: 'Myriad Pro Regular';
  font-style: normal;
  font-weight: normal;
  src: local('Myriad Pro Regular'), url('MYRIADPRO-REGULAR.woff') format('woff');
}

有什么建议么?

-编辑

包括丹在回答中提到的要点

➜  Client git:(feature/trivia-game-ui-2) ✗ ls -l public/static/fonts
total 1168
-rwxr-xr-x@ 1 maximveksler  staff  62676 Mar 17  2014 MYRIADPRO-BOLD.woff
-rwxr-xr-x@ 1 maximveksler  staff  61500 Mar 17  2014 MYRIADPRO-BOLDCOND.woff
-rwxr-xr-x@ 1 maximveksler  staff  66024 Mar 17  2014 MYRIADPRO-BOLDCONDIT.woff
-rwxr-xr-x@ 1 maximveksler  staff  66108 Mar 17  2014 MYRIADPRO-BOLDIT.woff
-rwxr-xr-x@ 1 maximveksler  staff  60044 Mar 17  2014 MYRIADPRO-COND.woff
-rwxr-xr-x@ 1 maximveksler  staff  64656 Mar 17  2014 MYRIADPRO-CONDIT.woff
-rwxr-xr-x@ 1 maximveksler  staff  61848 Mar 17  2014 MYRIADPRO-REGULAR.woff
-rwxr-xr-x@ 1 maximveksler  staff  62448 Mar 17  2014 MYRIADPRO-SEMIBOLD.woff
-rwxr-xr-x@ 1 maximveksler  staff  66232 Mar 17  2014 MYRIADPRO-SEMIBOLDIT.woff
➜  Client git:(feature/trivia-game-ui-2) ✗ cat src/containers/GameModule.css
.GameModule {
  padding: 15px;
}

@font-face {
  font-family: 'Myriad Pro Regular';
  font-style: normal;
  font-weight: normal;
  src: local('Myriad Pro Regular'), url('%PUBLIC_URL%/static/fonts/MYRIADPRO-REGULAR.woff') format('woff');
}

@font-face {
  font-family: 'Myriad Pro Condensed';
  font-style: normal;
  font-weight: normal;
  src: local('Myriad Pro Condensed'), url('%PUBLIC_URL%/static/fonts/MYRIADPRO-COND.woff') format('woff');
}

@font-face {
  font-family: 'Myriad Pro Semibold Italic';
  font-style: normal;
  font-weight: normal;
  src: local('Myriad Pro Semibold Italic'), url('%PUBLIC_URL%/static/fonts/MYRIADPRO-SEMIBOLDIT.woff') format('woff');
}

@font-face {
  font-family: 'Myriad Pro Semibold';
  font-style: normal;
  font-weight: normal;
  src: local('Myriad Pro Semibold'), url('%PUBLIC_URL%/static/fonts/MYRIADPRO-SEMIBOLD.woff') format('woff');
}

@font-face {
  font-family: 'Myriad Pro Condensed Italic';
  font-style: normal;
  font-weight: normal;
  src: local('Myriad Pro Condensed Italic'), url('%PUBLIC_URL%/static/fonts/MYRIADPRO-CONDIT.woff') format('woff');
}

@font-face {
  font-family: 'Myriad Pro Bold Italic';
  font-style: normal;
  font-weight: normal;
  src: local('Myriad Pro Bold Italic'), url('%PUBLIC_URL%/static/fonts/MYRIADPRO-BOLDIT.woff') format('woff');
}

@font-face {
  font-family: 'Myriad Pro Bold Condensed Italic';
  font-style: normal;
  font-weight: normal;
  src: local('Myriad Pro Bold Condensed Italic'), url('%PUBLIC_URL%/static/fonts/MYRIADPRO-BOLDCONDIT.woff') format('woff');
}

@font-face {
  font-family: 'Myriad Pro Bold Condensed';
  font-style: normal;
  font-weight: normal;
  src: local('Myriad Pro Bold Condensed'), url('%PUBLIC_URL%/static/fonts/MYRIADPRO-BOLDCOND.woff') format('woff');
}

@font-face {
  font-family: 'Myriad Pro Bold';
  font-style: normal;
  font-weight: normal;
  src: local('Myriad Pro Bold'), url('%PUBLIC_URL%/static/fonts/MYRIADPRO-BOLD.woff') format('woff');
}

问题答案:

有两种选择:

使用导入

这是建议的选项。它可以确保字体通过构建管道,在编译过程中散列,以便浏览器缓存正常工作,并且在缺少文件的情况下得到编译错误。

如“添加图像,字体和文件”中所述,您需要从JS导入CSS文件。例如,默认情况下src/index.js导入src/index.css

import './index.css';

这样的CSS文件会通过构建管道,并且可以引用字体和图像。例如,如果在中放置字体src/fonts/MyFont.woff,则index.css可能包括以下内容:

@font-face {
  font-family: 'MyFont';
  src: local('MyFont'), url(./fonts/MyFont.woff) format('woff');
}

请注意,我们如何使用以开头的相对路径./。这是一种特殊的表示法,可以帮助构建管道(由Webpack驱动)发现此文件。

通常,这应该足够了。

使用资料public

如果由于某种原因您 不想
使用构建管道,而是以“经典方式”进行构建,则可以使用该public文件夹并将字体放在此处。

这种方法的缺点是,在进行生产编译时文件不会散列,因此每次更改它们时都必须更新其名称,否则浏览器将缓存旧版本。

如果要用这种方法,请将字体放在public文件夹中的某个位置,例如,public/fonts/MyFont.woff。如果您采用这种方法,则还应该将CSS文件放入public文件夹中,
而不
要从JS导入它们,因为混合使用这些方法将非常混乱。因此,如果您仍然想要这样做,则将有一个类似的文件public/index.css。您必须从手动将<link>样式表添加到public/index.html

<link rel="stylesheet" href="%PUBLIC_URL%/index.css">

在其中,您将使用常规的CSS表示法:

@font-face {
  font-family: 'MyFont';
  src: local('MyFont'), url(fonts/MyFont.woff) format('woff');
}

注意我如何使用它fonts/MyFont.woff作为路径。这是因为index.csspublic文件夹位于文件夹中,因此可以从公共路径(通常是服务器根目录)进行提供,但是如果您部署到GitHub
Pages并将homepage字段设置为http://myuser.github.io/myproject,则可以从进行提供/myproject。但是fonts,该public文件也位于该文件夹中,因此可以fonts相对地(http://mywebsite.com/fontshttp://myuser.github.io/myproject/fonts)进行投放。因此,我们使用相对路径。

请注意,由于在本示例中我们避免使用构建管道,因此它不会验证文件是否实际存在。这就是为什么我不推荐这种方法的原因。另一个问题是我们的index.css文件没有被缩小并且没有散列。因此,对于最终用户而言,它的运行速度将会变慢,并且浏览器可能会缓存文件的旧版本。

使用哪种方式?

使用第一种方法(“使用导入”)。我仅描述了第二个,因为这是您尝试执行的操作(根据您的评论来判断),但是它有很多问题,并且只有在解决某些问题时才是最后的选择。



 类似资料:
  • 问题内容: 我的项目基于create-react-app。或默认情况下,将在 端口3000 上运行该应用程序,并且在package.json中没有指定端口的选项。 在这种情况下,如何指定自己选择的端口?我想同时运行此项目的两个(用于测试),一个在端口,另一个在 问题答案: 如果您不想设置环境变量,则另一个选择是从以下位置修改package.json 的一部分: 至 Linux (在Ubuntu 1

  • 问题内容: Node通过传递命令行标志来增加堆大小。在create-react-app项目中,一切都取决于react- scripts的使用。如何在此类项目中传递此参数,我最好在哪里进行? 谢谢你的帮助。 问题答案: 非常感谢@ dan-abramov,因为他的评论是答案!(以防万一,请给他投票)。 你可以把例如在那里,而不是

  • 我正在尝试在反应加载之前添加一个闪屏。 因为我使用的是react脚本/react-app,所以我的index.tsx只有以下部分: 我试着在同一个页面上添加我自己的div,但它没有显示出来。 我想显示一个简单的空白屏幕与我的飞溅图像在1秒定时器之前的反应加载,以避免/隐藏渲染元素的移动。 **如果我确实在app.tsx中添加了屏幕,则在屏幕加载之前会发生移动 更新 正如Rishabh在下面指出的,

  • 我正在部署一个网站,它将有几个反应项目,是用create-react-app构建的。每个项目都将在自己的网页上:例如:mywebsite.com/project1,mywebsite.com/project.我正在Ubuntu服务器上设置一个nginx反向代理(我知道如何配置),但我不确定如何指定端口号对于我的每个创建-反应-应用程序项目,以便每个项目都有一个唯一的端口。有人能解释一下如何做到这一

  • Create React App 不用配置就可以创建 React App。 全局安装: npm install -g create-react-app 创建 App: create-react-app my-appcd my-app/ 启动 npm: npm start 打开 http://localhost:3000/  查看你的 App。 如果你准备将其部署到生产环境,只需创建一个压缩包,并且运行 npm run build。

  • 问题内容: 根据Dan Abramov 的推文,CSS模块支持位于create- react-app(CRA)中。只需扩展其样式表即可启用该功能,但这对我不起作用。我的版本为1.1.4 。如何使用CRA启用CSS模块?谢谢 问题答案: 您无需弹出。 从版本2开始,Create React App就立即支持CSS模块,该版本现已稳定。 通过运行或升级到v2()。 您只需要创建带有扩展名的文件 例如: