Używam aplikacji create-react- i wolę tego nie robićeject
.
Nie jest jasne, gdzie powinny znajdować się czcionki importowane przez @ font-face i ładowane lokalnie.
Mianowicie ładuję
@font-face {
font-family: 'Myriad Pro Regular';
font-style: normal;
font-weight: normal;
src: local('Myriad Pro Regular'), url('MYRIADPRO-REGULAR.woff') format('woff');
}
Jakieś sugestie?
-- EDYTOWAĆ
Włączając sedno, do którego Dan nawiązał w swojej odpowiedzi
➜ 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%
nie może działać (i jest niepotrzebne) w pliku CSS. Ponadto, jak opisano w przewodniku, w prawie wszystkich przypadkach należy używać importu JS, a nie folderu publicznego.Odpowiedzi:
Istnieją dwie możliwości:
Korzystanie z importu
To jest sugerowana opcja. Zapewnia to, że czcionki przechodzą przez potok kompilacji, uzyskują skróty podczas kompilacji, dzięki czemu buforowanie przeglądarki działa poprawnie, a w przypadku braku plików pojawiają się błędy kompilacji.
Jak opisano w „Dodawanie obrazów, czcionek i plików” , musisz mieć plik CSS zaimportowany z JS. Na przykład domyślnie
src/index.js
importujesrc/index.css
:Taki plik CSS przechodzi przez proces kompilacji i może odnosić się do czcionek i obrazów. Na przykład, jeśli umieścisz czcionkę
src/fonts/MyFont.woff
, możeszindex.css
dołączyć to:Zwróć uwagę, jak używamy ścieżki względnej zaczynającej się od
./
. Jest to specjalna notacja, która pomaga potokowi kompilacji (opartemu na pakiecie Webpack) wykryć ten plik.Zwykle to powinno wystarczyć.
Korzystanie z
public
folderuJeśli z jakiegoś powodu wolisz nie używać potoku kompilacji i zamiast tego zrobić to w „klasyczny sposób”, możesz użyć
public
folderu i umieścić tam swoje czcionki.Wadą tego podejścia jest to, że pliki nie otrzymują skrótów podczas kompilacji do produkcji, więc będziesz musiał aktualizować ich nazwy za każdym razem, gdy je zmienisz, lub przeglądarki będą buforować stare wersje.
Jeśli chcesz to zrobić w ten sposób, umieść czcionki gdzieś w
public
folderze, na przykład wpublic/fonts/MyFont.woff
. Jeśli zastosujesz się do tego podejścia, powinieneś również umieścić pliki CSS wpublic
folderze i nie importować ich z JS, ponieważ mieszanie tych podejść będzie bardzo mylące. Jeśli więc nadal chcesz to zrobić, będziesz mieć plik, taki jakpublic/index.css
. Musiałbyś ręcznie dodać<link>
do tego arkusza stylów zpublic/index.html
:Wewnątrz tego użyłbyś zwykłej notacji CSS:
Zwróć uwagę, jak używam
fonts/MyFont.woff
ścieżki. Dzieje się tak, ponieważindex.css
znajduje się wpublic
folderze, więc będzie obsługiwany ze ścieżki publicznej (zwykle jest to katalog główny serwera, ale jeśli wdrożysz na GitHub Pages i ustawiszhomepage
pole nahttp://myuser.github.io/myproject
, będzie obsługiwane z/myproject
). Jednakfonts
znajdują się one również wpublic
folderze, więc będą obsługiwane zefonts
względnie (albohttp://mywebsite.com/fonts
albohttp://myuser.github.io/myproject/fonts
). Dlatego używamy ścieżki względnej.Zwróć uwagę, że ponieważ w tym przykładzie unikamy potoku kompilacji, nie weryfikuje on, czy plik faktycznie istnieje. Dlatego nie polecam tego podejścia. Innym problemem jest to, że nasz
index.css
plik nie zostaje zminimalizowany i nie otrzymuje skrótu. Więc to będzie wolniejsze dla użytkowników końcowych i ryzykujesz, że przeglądarki buforują stare wersje pliku.Który sposób użyć?
Wybierz pierwszą metodę („Korzystanie z importu”). Opisałem tylko drugą, ponieważ to właśnie próbowałaś zrobić (sądząc po komentarzu), ale ma wiele problemów i powinna być ostatecznością tylko wtedy, gdy pracujesz nad jakimś problemem.
źródło
ttf
czcionkę, należy podaćtruetype
zamiastttf
parametruformat
* .otf
, musisz umieścićopentype
.Oto kilka sposobów na zrobienie tego:
1. Importowanie czcionki
Na przykład, aby używać Roboto, zainstaluj pakiet za pomocą
lub
W index.js:
Istnieją pakiety npm dla wielu czcionek open source i większości czcionek Google. Można zobaczyć wszystkie czcionki tutaj . Wszystkie pakiety pochodzą z tego projektu .
2. W przypadku czcionek udostępnianych przez inną firmę
Na przykład czcionki Google, możesz przejść do fonts.google.com, gdzie możesz znaleźć linki, które możesz umieścić w swoim
public/index.html
To będzie jak
lub
3. Pobranie czcionki i dodanie jej do kodu źródłowego.
Pobierz czcionkę. Na przykład w przypadku czcionek Google możesz przejść do fonts.google.com . Kliknij przycisk pobierania, aby pobrać czcionkę.
Przenieś czcionkę do
fonts
katalogu w swoimsrc
kataloguTeraz
App.css
dodaj toAby uzyskać
ttf
format, musisz wspomniećformat('truetype')
. dlawoff
,format('woff')
Teraz możesz używać czcionki na zajęciach.
4. Korzystanie z pakietu web-font-loader
Zainstaluj pakiet za pomocą
lub
W programie
src/index.js
możesz to zaimportować i określić potrzebne czcionkiźródło
fonts
folder nie był umieszczany podsrc
, alepublic
zamiast tego? Próbowałem, ale wydaje mi się, że to niedozwolone ...For ttf format, you have to mention format('truetype'). For woff, format('woff')
zrobił to dla mnie! Dziękuję Ci!Otworzy się w ten sposób:
4, Skopiuj i wklej ten kod do swojego style.css i po prostu zacznij używać tej czcionki w ten sposób:
Wynik:
źródło
Możesz skorzystać z modułu WebFont , który znacznie upraszcza proces.
źródło
Popełniłem takie błędy.
W ten sposób działa poprawnie
źródło
Spędziłem cały ranek na rozwiązywaniu podobnego problemu po tym, jak trafiłem na to stosowne pytanie. Użyłem pierwszego rozwiązania Dana w powyższej odpowiedzi jako punktu wyjścia.
Problem
Mam środowisko deweloperskie (to jest na moim komputerze lokalnym), pomostowe i produkcyjne. Moje środowiska pomostowe i produkcyjne znajdują się na tym samym serwerze.
Aplikacja jest wdrażana do przemieszczania za pośrednictwem,
acmeserver/~staging/note-taking-app
a wersja produkcyjna znajduje się pod adresemacmeserver/note-taking-app
(winić IT).Wszystkie pliki multimedialne, takie jak czcionki, ładowały się idealnie na dev (tj
react-scripts start
.).Jednak gdy tworzyłem i przesyłałem kompilacje przejściowe
.css
i produkcyjne, podczas gdy.js
pliki i ładowały się prawidłowo, czcionki nie były. Skompilowany.css
plik ma poprawną ścieżkę, ale żądanie HTTP przeglądarki otrzymywało bardzo złą ścieżkę (pokazaną poniżej).Skompilowany
main.fc70b10f.chunk.css
plik:Żądanie http przeglądarki jest pokazane poniżej. Zwróć uwagę, jak to się dodaje,
/static/css/
gdy plik czcionki po prostu znajduje się w/static/media/
a także kopiuje folder docelowy. Wykluczyłem, że winowajcą była konfiguracja serwera.To też
Referer
jest częściowo wina.package.json
Plik miałhomepage
właściwość zestaw do./note-taking-app
. To powodowało problem.Rozwiązanie
To było długie, ale rozwiązaniem jest:
PUBLIC_URL
zmienną env w zależności od środowiskahomepage
właściwość zpackage.json
plikuPoniżej znajduje się moja
.env-cmdrc
teczka. Używam.env-cmdrc
ponad zwykłego,.env
ponieważ utrzymuje wszystko razem w jednym pliku.Routing przez również
react-router-dom
działa dobrze - po prostu użyjPUBLIC_URL
zmiennej env jakobasename
właściwości.Konfiguracja serwera jest ustawiona tak, aby kierować wszystkie żądania do
./index.html
pliku.Wreszcie, oto
main.fc70b10f.chunk.css
jak wygląda skompilowany plik po wprowadzeniu omówionych zmian.Materiały do czytania
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
zmienną środowiskowąźródło