Comment ajouter des polices pour créer des projets basés sur react-app?

Je suis l'aide de créez-réagir-app et préfèrent ne pas eject.

Il n'est pas clair où les polices importées via @font-face et chargées localement devraient aller.

À savoir, je charge

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

Des suggestions?

-- modifier

Y compris l'essentiel auquel Dan fait référence dans sa réponse

➜  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');
}
68
demandé sur sudo bangbang 2017-01-16 15:04:46

4 réponses

Il y a deux options:

Utilisation Des Importations

C'est l'option suggérée. Il garantit que vos polices passent par le pipeline de construction, obtiennent des hachages pendant la compilation afin que la mise en cache du navigateur fonctionne correctement, et que vous obtenez des erreurs de compilation si les fichiers sont manquants.

Comme décrit dans "Ajout de feuilles de style sur les polices" , vous devez avoir un fichier CSS importé de JS. Par exemple, par défaut src/index.js importe src/index.css:

import './index.css';

Un fichier CSS comme celui-ci va à travers le pipeline de construction, et peut référencer les polices et les images. Par exemple, si vous mettez une police dans src/fonts/MyFont.woff votre index.css peut inclure ceci:

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

Remarquez comment nous utilisons un chemin relatif commençant par ./. Ceci est une notation spéciale qui aide le pipeline de construction (alimenté par Webpack) à découvrir ce fichier.

Normalement, cela devrait suffire.

Utilisation Du Dossier public

Si pour une raison quelconque vous préférez pas utiliser le pipeline de construction, et à la place le faire "Classic way", vous pouvez utiliser le dossier public et y mettre vos polices.

L'inconvénient de cette approche est que les fichiers ne reçoivent pas de hachages lorsque vous compilez pour la production, vous devrez donc mettre à jour leurs noms chaque fois que vous les modifiez, ou les navigateurs mettront en cache les anciennes versions.

Si vous voulez le faire de cette façon, placez les polices quelque part dans le dossier public, par exemple, dans public/fonts/MyFont.woff. Si vous suivez cette approche, vous devez également placer les fichiers CSS dans le dossier public et pas les importer à partir de JS car mélanger ces approches va être très déroutant. Donc, si vous voulez le faire, vous auriez un fichier comme public/index.css. Vous devez ajouter manuellement <link> pour cette feuille de style à partir de public/index.html:

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

Et à l'intérieur de celui-ci, vous utiliseriez la notation CSS régulière:

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

Remarquez comment j'utilise {[17] } comme chemin. C'est parce que index.css est dans le dossier public donc il sera servi à partir du chemin public (généralement c'est la racine du serveur, mais si vous déployez sur les Pages GitHub et définissez votre champ homepage sur http://myuser.github.io/myproject, Il sera servi à partir de /myproject). Cependant fonts, sont également dans le public dossier, de sorte qu'ils seront servis à partir de fonts relativement (soit http://mywebsite.com/fonts ou http://myuser.github.io/myproject/fonts). Par conséquent, nous utilisons le chemin relatif.

Notez que puisque nous évitons le pipeline de construction dans cet exemple, il ne vérifie pas que le fichier existe réellement. C'est pourquoi je ne recommande pas cette approche. Un autre problème est que notre fichier index.css n'est pas minifié et ne obtenez une table de hachage. Donc, cela va être plus lent pour les utilisateurs finaux, et vous risquez que les navigateurs mettent en cache les anciennes versions du fichier.

Quelle façon D'utiliser?

Allez avec la première méthode ("Utilisation des importations"). J'ai seulement décrit le second puisque c'est ce que vous avez essayé de faire (à en juger par votre commentaire), mais il a beaucoup de problèmes et ne devrait être que le dernier recours lorsque vous travaillez autour d'un problème.

130
répondu Dan Abramov 2017-12-14 15:12:43

Vous pouvez utiliser le module WebFont, ce qui simplifie grandement le processus.

render(){
  webfont.load({
     custom: {
       families: ['MyFont'],
       urls: ['/fonts/MyFont.woff']
     }
  });
  return (
    <div style={your style} >
      your text!
    </div>
  );
}
1
répondu Delfino 2018-07-14 01:36:37

Voici quelques façons de le faire:

1. Importation de la police

Par exemple, pour utiliser Roboto, installez le paquet en utilisant

yarn add typeface-roboto

Ou

npm install typeface-roboto --save

Dans l'index.js:

import "typeface-roboto";

Il existe des paquets npm pour beaucoup de polices open source et la plupart des polices Google. Vous pouvez voir toutes les polices ici. Tous les paquets proviennent de ce projet .

2. Pour les polices hébergées par des tiers

Par exemple, Google fonts, vous pouvez aller à fonts.google.com, où vous pouvez trouver des liens que vous pouvez mettre dans votre public/index.html

capture d'écran de fonts.google.com

Ce sera comme

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

Ou

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

3. Utilisation du paquet Web-font-loader

Installer le paquet en utilisant

yarn add webfontloader

Ou

npm install webfontloader --save

Dans src/index.js, Vous pouvez importer ceci et spécifier les polices nécessaires

import WebFont from 'webfontloader';

WebFont.load({
   google: {
     families: ['Titillium Web:300,400,700', 'sans-serif']
   }
});
1
répondu sudo bangbang 2018-09-18 18:39:01

Je faisais des erreurs comme ça.

@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";

Cela fonctionne correctement de cette façon,

@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
répondu Yasin UYSAL 2018-09-14 08:36:34