J'utilise create-react-app et je préfère ne pas le faire eject
.
On ne sait pas où doivent aller les polices importées via @ font-face et chargées localement.
À 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');
}
Aucune suggestion?
-- ÉDITER
Y compris l'essentiel auquel Dan se réfère 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');
}
%PUBLIC_URL%
ne peut pas fonctionner (et n'est pas nécessaire) dans un fichier CSS. De plus, comme décrit dans le guide, vous devez utiliser les importations JS dans presque tous les cas, pas le dossier public.Réponses:
Il existe 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 lors de la compilation afin que la mise en cache du navigateur fonctionne correctement et que vous obteniez des erreurs de compilation si les fichiers sont manquants.
Comme décrit dans «Ajout d'images, de polices et de fichiers» , vous devez avoir un fichier CSS importé de JS. Par exemple, par défaut
src/index.js
importesrc/index.css
:Un fichier CSS comme celui-ci passe par le pipeline de construction et peut référencer des polices et des images. Par exemple, si vous mettez une police
src/fonts/MyFont.woff
, vousindex.css
pouvez inclure ceci:Remarquez comment nous utilisons un chemin relatif commençant par
./
. Il s'agit d'une notation spéciale qui aide le pipeline de construction (alimenté par Webpack) à découvrir ce fichier.Normalement, cela devrait suffire.
Utilisation du
public
dossierSi, pour une raison quelconque, vous préférez ne pas utiliser le pipeline de construction, et le faire à la place de la «manière classique», vous pouvez utiliser le
public
dossier et y placer vos polices.L'inconvénient de cette approche est que les fichiers n'obtiennent pas de hachage lorsque vous compilez pour la production, vous devrez donc mettre à jour leurs noms à chaque fois que vous les modifiez, sinon les navigateurs mettront en cache les anciennes versions.
Si vous voulez le faire de cette façon, placez les polices quelque part dans le
public
dossier, par exemple, danspublic/fonts/MyFont.woff
. Si vous suivez cette approche, vous devez également mettre les fichiers CSS dans unpublic
dossier et ne pas les importer de JS car le mélange de ces approches sera très déroutant. Donc, si vous voulez toujours le faire, vous aurez un fichier commepublic/index.css
. Vous devrez ajouter manuellement<link>
à cette feuille de style à partir depublic/index.html
:Et à l'intérieur de celui-ci, vous utiliseriez la notation CSS régulière:
Remarquez comment j'utilise
fonts/MyFont.woff
comme chemin. En effet, il seindex.css
trouve dans lepublic
dossier, il sera donc servi à partir du chemin public (il s'agit généralement de la racine du serveur, mais si vous déployez sur les pages GitHub et définissez votrehomepage
champ surhttp://myuser.github.io/myproject
, il sera servi à partir de/myproject
). Cependantfonts
sont également dans lepublic
dossier, de sorte qu'ils seront servis defonts
relativement (soithttp://mywebsite.com/fonts
ouhttp://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
index.css
fichier n'est pas minifié et ne reçoit pas de hachage. Cela va donc être plus lent pour les utilisateurs finaux, et vous risquez que les navigateurs mettent en cache les anciennes versions du fichier.Quelle manière utiliser?
Allez avec la première méthode («Utilisation des importations»). Je n'ai décrit que le second car c'est ce que vous avez essayé de faire (à en juger par votre commentaire), mais il présente de nombreux problèmes et ne devrait être que le dernier recours lorsque vous travaillez sur un problème.
la source
ttf
police, vous devez donnertruetype
au lieu dettf
comme paramètre auformat
* .otf
vous devez mettreopentype
.Voici quelques façons de procéder:
1. Importation de la police
Par exemple, pour utiliser Roboto, installez le package en utilisant
ou
Dans index.js:
Il existe des packages npm pour de nombreuses polices open source et la plupart des polices Google. Vous pouvez voir toutes les polices ici . Tous les packages proviennent de ce projet .
2. Pour les polices hébergées par des tiers
Par exemple, les polices Google, vous pouvez accéder à fonts.google.com où vous pouvez trouver des liens que vous pouvez mettre dans votre
public/index.html
Ce sera comme
ou
3. Télécharger la police et l'ajouter dans votre code source.
Téléchargez la police. Par exemple, pour les polices google, vous pouvez accéder à fonts.google.com . Cliquez sur le bouton de téléchargement pour télécharger la police.
Déplacez la police dans le
fonts
répertoire de votresrc
répertoireMaintenant
App.css
, ajoutez ceciPour le
ttf
format, vous devez mentionnerformat('truetype')
. Pourwoff
,format('woff')
Vous pouvez maintenant utiliser la police dans les classes.
4. Utilisation du package web-font-loader
Installer le package en utilisant
ou
Dans
src/index.js
, vous pouvez l'importer et spécifier les polices nécessairesla source
fonts
dossier soussrc
, maispublic
plutôt sous ? Je l'ai essayé, mais cela ne semble pas autorisé ...For ttf format, you have to mention format('truetype'). For woff, format('woff')
l'a fait pour moi! Merci!Il s'ouvrira comme ceci:
4, copiez et collez ce code dans votre style.css et commencez simplement à utiliser cette police comme ceci:
Résultat:
la source
Vous pouvez utiliser le module WebFont , ce qui simplifie grandement le processus.
la source
Je faisais de telles erreurs.
Cela fonctionne correctement de cette façon
la source
J'ai passé toute la matinée à résoudre un problème similaire après avoir atterri sur cette question de pile. J'ai utilisé la première solution de Dan dans la réponse ci-dessus comme point de départ.
Problème
J'ai un environnement de développement (sur ma machine locale), de préparation et de production. Mes environnements de préparation et de production vivent sur le même serveur.
L'application est déployée pour la mise en scène via
acmeserver/~staging/note-taking-app
et la version de production vitacmeserver/note-taking-app
(blâmez l'informatique).Tous les fichiers multimédias tels que les polices se chargeaient parfaitement sur dev (ie,
react-scripts start
).Cependant, lorsque j'ai créé et téléchargé des versions intermédiaires et de production, alors que les fichiers
.css
et.js
se chargeaient correctement, les polices ne l'étaient pas. Le.css
fichier compilé semblait avoir un chemin correct mais la requête http du navigateur recevait un chemin très incorrect (illustré ci-dessous).Le
main.fc70b10f.chunk.css
fichier compilé :La requête http du navigateur est présentée ci-dessous. Notez comment il s'ajoute
/static/css/
lorsque le fichier de police se trouve tout simplement/static/media/
ainsi que la duplication du dossier de destination. J'ai exclu que la configuration du serveur soit le coupable.Le
Referer
est en partie en faute aussi.Le
package.json
fichier avait lahomepage
propriété définie sur./note-taking-app
. Cela causait le problème.Solution
C'était long - mais la solution est de:
PUBLIC_URL
variable env en fonction de l'environnementhomepage
propriété dupackage.json
fichierCi-dessous mon
.env-cmdrc
dossier. J'utilise.env-cmdrc
plus régulièrement.env
car il garde tout ensemble dans un seul fichier.Le routage via
react-router-dom
fonctionne bien aussi - utilisez simplement laPUBLIC_URL
variable env commebasename
propriété.La configuration du serveur est définie pour acheminer toutes les demandes vers le
./index.html
fichier.Enfin, voici à quoi
main.fc70b10f.chunk.css
ressemble le fichier compilé après l'implémentation des modifications discutées.Matériel de lecture
https://create-react-app.dev/docs/adding-custom-environment-variables#adding-development-environment-variables-in-env
https://create-react-app.dev/docs/deployment#serving-apps-with-client-side-routing
https://create-react-app.dev/docs/advanced-configuration
PUBLIC_URL
variable d'environnementla source