¿Cómo agregar fuentes a proyectos basados en create-react-app?


Estoy usando create-react-app y prefiero no eject.

No está claro dónde deberían ir las fuentes importadas a través de @font-face y cargadas localmente.

Es decir, estoy cargando

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

Alguna sugerencia?

EDIT EDITAR

Incluyendo la esencia a la que Dan se refiere en su respuesta

➜  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');
}
Author: sudo bangbang, 2017-01-16

4 answers

Hay dos opciones:

Utilizando importaciones

Esta es la opción sugerida. Garantiza que sus fuentes pasen por la canalización de compilación, obtengan hashes durante la compilación para que el almacenamiento en caché del navegador funcione correctamente y que obtenga errores de compilación si faltan los archivos.

Como se describe en "Agregar hojas de estilo a las fuentes", necesita tener un archivo CSS importado de JS. Por ejemplo, por defecto src/index.js importa src/index.css:

import './index.css';

Un archivo CSS como este va a través de la canalización de compilación, y puede hacer referencia a fuentes e imágenes. Por ejemplo, si pones una fuente en src/fonts/MyFont.woff, tu index.css podría incluir esto:

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

Observe cómo estamos usando una ruta relativa que comienza con ./. Esta es una notación especial que ayuda a la canalización de compilación (con tecnología de Webpack) a descubrir este archivo.

Normalmente esto debería ser suficiente.

Usando la carpeta public

Si por alguna razón prefieres no usar la canalización de compilación, y en su lugar hazlo de la siguiente manera: "forma clásica", puede utilizar la carpeta public y poner sus fuentes allí.

La desventaja de este enfoque es que los archivos no obtienen hashes cuando compila para producción, por lo que tendrá que actualizar sus nombres cada vez que los cambie, o los navegadores almacenarán en caché las versiones anteriores.

Si desea hacerlo de esta manera, coloque las fuentes en algún lugar de la carpeta public, por ejemplo, en public/fonts/MyFont.woff. Si sigue este enfoque, también debe poner archivos CSS en la carpeta public y no importarlos desde JS porque mezclar estos enfoques va a ser muy confuso. Por lo tanto, si todavía desea hacerlo, tendría un archivo como public/index.css. Tendrías que añadir manualmente <link> a esta hoja de estilos desde public/index.html:

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

Y dentro de ella, usarías la notación CSS regular:

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

Observe cómo estoy usando fonts/MyFont.woff como el camino. Esto se debe a que index.css está en la carpeta public por lo que se servirá desde la ruta pública (generalmente es la raíz del servidor, pero si despliega en las páginas de GitHub y establece tu campo homepage en http://myuser.github.io/myproject, se servirá desde /myproject). Sin embargo, fonts también están en la carpeta public, por lo que se servirán desde fonts relativamente (ya sea http://mywebsite.com/fonts o http://myuser.github.io/myproject/fonts). Por lo tanto, usamos el camino relativo.

Tenga en cuenta que ya que estamos evitando la canalización de compilación en este ejemplo, no verifica que el archivo realmente exista. Es por eso que no recomiendo este enfoque. Otro problema es que nuestro archivo index.css no se minimiza y no obtener un hash. Así que va a ser más lento para los usuarios finales, y corre el riesgo de que los navegadores almacenen en caché versiones antiguas del archivo.

¿Qué Manera de Usar?

Vaya con el primer método ("Usando importaciones"). Solo describí el segundo ya que eso es lo que intentaste hacer (a juzgar por tu comentario), pero tiene muchos problemas y solo debería ser el último recurso cuando estés trabajando en algún tema.

 130
Author: Dan Abramov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-14 15:12:43

Puede utilizar el módulo WebFont, que simplifica enormemente el proceso.

render(){
  webfont.load({
     custom: {
       families: ['MyFont'],
       urls: ['/fonts/MyFont.woff']
     }
  });
  return (
    <div style={your style} >
      your text!
    </div>
  );
}
 1
Author: Delfino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-14 01:36:37

Aquí hay algunas maneras de hacer esto:

1. Importing font

Por ejemplo, para usar Roboto, instale el paquete usando

yarn add typeface-roboto

O

npm install typeface-roboto --save

En el índice.js:

import "typeface-roboto";

Hay paquetes npm para muchas fuentes de código abierto y la mayoría de las fuentes de Google. Puedes ver todas las fuentes aquí. Todos los paquetes son de ese proyecto .

2. Para fuentes alojadas por terceros

Por ejemplo, Google fonts, puede ir a fonts.google.com donde puedes encontrar enlaces que puedes poner en tu public/index.html

captura de pantalla de fonts.google.com

Será como

<link href="https://fonts.googleapis.com/css?family=Montserrat" rel="stylesheet">

O

<style>
    @import url('https://fonts.googleapis.com/css?family=Montserrat');
</style>

3. Usando el paquete web-font-loader

Instalar el paquete usando

yarn add webfontloader

O

npm install webfontloader --save

En src/index.js, puede importar esto y especificar las fuentes necesarias

import WebFont from 'webfontloader';

WebFont.load({
   google: {
     families: ['Titillium Web:300,400,700', 'sans-serif']
   }
});
 1
Author: sudo bangbang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-18 18:39:01

Estaba cometiendo errores como este.

@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i&amp;subset=cyrillic,cyrillic-ext,latin-ext";
@import "https://use.fontawesome.com/releases/v5.3.1/css/all.css";

Funciona correctamente de esta manera

@import url(https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i&amp;subset=cyrillic,cyrillic-ext,latin-ext);
@import url(https://use.fontawesome.com/releases/v5.3.1/css/all.css);
 0
Author: Yasin UYSAL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-14 08:36:34