Saya menggunakan create-react-app dan memilih untuk tidak melakukannya eject
.
Tidak jelas ke mana font yang diimpor melalui @ font-wajah dan dimuat secara lokal harus pergi.
Yaitu, saya memuat
@font-face {
font-family: 'Myriad Pro Regular';
font-style: normal;
font-weight: normal;
src: local('Myriad Pro Regular'), url('MYRIADPRO-REGULAR.woff') format('woff');
}
Ada saran?
- EDIT
Termasuk intisari yang dimaksud Dan dalam jawabannya
➜ 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%
tidak dapat bekerja (dan tidak perlu) dalam file CSS. Juga, seperti dijelaskan dalam panduan ini, Anda harus menggunakan impor JS di hampir semua kasus, bukan folder publik.Jawaban:
Ada dua opsi:
Menggunakan Impor
Ini adalah opsi yang disarankan. Ini memastikan font Anda melewati pipeline build, mendapatkan hash saat kompilasi sehingga cache browser berfungsi dengan benar, dan Anda mendapatkan kesalahan kompilasi jika file hilang.
Seperti yang dijelaskan dalam "Menambahkan Gambar, Font, dan File" , Anda harus memiliki file CSS yang diimpor dari JS. Misalnya, dengan
src/index.js
impor defaultsrc/index.css
:File CSS seperti ini melewati pipeline build, dan dapat merujuk font dan gambar. Misalnya, jika Anda memasukkan font
src/fonts/MyFont.woff
, Andaindex.css
mungkin menyertakan ini:Perhatikan bagaimana kami menggunakan jalur relatif yang dimulai dengan
./
. Ini adalah notasi khusus yang membantu pipeline build (diberdayakan oleh Webpack) menemukan file ini.Biasanya ini sudah cukup.
Menggunakan
public
FolderJika karena alasan tertentu Anda memilih untuk tidak menggunakan pipa build, dan alih-alih melakukannya dengan "cara klasik", Anda dapat menggunakan
public
folder dan meletakkan font Anda di sana.Kelemahan dari pendekatan ini adalah bahwa file tidak mendapatkan hash ketika Anda mengkompilasi untuk produksi sehingga Anda harus memperbarui nama mereka setiap kali Anda mengubahnya, atau browser akan men-cache versi lama.
Jika Anda ingin melakukannya dengan cara ini, masukkan font di suatu tempat ke dalam
public
folder, misalnya, kepublic/fonts/MyFont.woff
. Jika Anda mengikuti pendekatan ini, Anda harus meletakkan file CSS kepublic
folder juga dan tidak mengimpornya dari JS karena menggabungkan pendekatan ini akan sangat membingungkan. Jadi, jika Anda masih ingin melakukannya, Anda akan memiliki file sepertipublic/index.css
. Anda harus menambahkan secara manual<link>
ke stylesheet ini daripublic/index.html
:Dan di dalamnya, Anda akan menggunakan notasi CSS biasa:
Perhatikan bagaimana saya menggunakan
fonts/MyFont.woff
sebagai jalur. Ini karenaindex.css
ada dipublic
folder sehingga akan disajikan dari jalur publik (biasanya itu root server, tetapi jika Anda menyebarkan ke Halaman GitHub dan mengaturhomepage
bidang Andahttp://myuser.github.io/myproject
, itu akan dilayani dari/myproject
). Namunfonts
juga ada dipublic
folder, sehingga mereka akan dilayani dari yangfonts
relatif (salah satuhttp://mywebsite.com/fonts
atauhttp://myuser.github.io/myproject/fonts
). Karena itu kami menggunakan jalur relatif.Perhatikan bahwa karena kita menghindari pipeline build dalam contoh ini, itu tidak memverifikasi bahwa file tersebut benar-benar ada. Inilah mengapa saya tidak merekomendasikan pendekatan ini. Masalah lain adalah
index.css
file kita tidak di-minify dan tidak di-hash. Jadi itu akan menjadi lebih lambat bagi pengguna akhir, dan Anda berisiko peramban melakukan caching versi lama file tersebut.Cara yang Digunakan?
Pergilah dengan metode pertama ("Menggunakan Impor"). Saya hanya menggambarkan yang kedua karena itulah yang Anda coba lakukan (menilai dengan komentar Anda), tetapi itu memiliki banyak masalah dan seharusnya hanya menjadi pilihan terakhir ketika Anda sedang menangani beberapa masalah.
sumber
ttf
font, Anda harus memberitruetype
alih-alihttf
sebagai parameter keformat
* .otf
Anda harus memasukkanopentype
.Berikut ini beberapa cara untuk melakukan ini:
1. Mengimpor font
Misalnya, untuk menggunakan Roboto, instal paket menggunakan
atau
Di index.js:
Ada paket npm untuk banyak font sumber terbuka dan sebagian besar font Google. Anda dapat melihat semua font di sini . Semua paket berasal dari proyek itu .
2. Untuk font yang diselenggarakan oleh pihak ketiga
Misalnya font Google, Anda dapat membuka fonts.google.com di mana Anda dapat menemukan tautan yang dapat Anda masukkan ke dalam
public/index.html
Itu akan seperti
atau
3. Mengunduh font dan menambahkannya dalam kode sumber Anda.
Unduh fontnya. Misalnya, untuk font google, Anda dapat mengunjungi fonts.google.com . Klik tombol unduh untuk mengunduh font.
Pindahkan font ke
fonts
direktori disrc
direktori AndaSekarang, masuk
App.css
, tambahkan iniUntuk
ttf
format, Anda harus menyebutkanformat('truetype')
. Untukwoff
,format('woff')
Sekarang Anda dapat menggunakan font di kelas.
4. Menggunakan paket web-font-loader
Instal paket menggunakan
atau
Di
src/index.js
, Anda dapat mengimpor ini dan menentukan font yang diperlukansumber
fonts
folder di bawahsrc
, tetapipublic
sebaliknya? Saya mencobanya, tetapi tampaknya tidak diizinkan ...For ttf format, you have to mention format('truetype'). For woff, format('woff')
melakukannya untukku! Terima kasih!Ini akan terbuka seperti ini:
4, Salin dan tempel kode itu di style.css Anda dan mulai gunakan font itu seperti ini:
Hasil:
sumber
Anda dapat menggunakan modul WebFont , yang sangat menyederhanakan prosesnya.
sumber
Saya melakukan kesalahan seperti ini.
Ini berfungsi dengan baik dengan cara ini
sumber
Saya menghabiskan seluruh pagi memecahkan masalah yang sama setelah mendarat di pertanyaan tumpukan ini. Saya menggunakan solusi pertama Dan di jawaban di atas sebagai titik tolak.
Masalah
Saya memiliki dev (ini di mesin lokal saya), pementasan, dan lingkungan produksi. Lingkungan pementasan dan produksi saya tinggal di server yang sama.
Aplikasi ini digunakan untuk pementasan melalui
acmeserver/~staging/note-taking-app
dan versi produksi tinggal diacmeserver/note-taking-app
(salahkan IT).Semua file media seperti font memuat dengan baik-baik saja di dev (yaitu,
react-scripts start
).Namun, ketika saya membuat dan mengunggah pementasan dan produksi, sementara file
.css
dan.js
memuat dengan benar, font tidak. Dikompilasi.css
tampaknya memiliki jalur yang benar tetapi permintaan http browser mendapatkan beberapa jalur yang sangat salah (ditampilkan di bawah).File yang dikompilasi
main.fc70b10f.chunk.css
:Permintaan http browser ditunjukkan di bawah ini. Perhatikan bagaimana hal itu ditambahkan
/static/css/
ketika file font hanya tinggal/static/media/
dan juga menduplikasi folder tujuan. Saya mengesampingkan konfigurasi server menjadi pelakunya.The
Referer
sebagian bersalah juga.The
package.json
berkas memilikihomepage
set properti untuk./note-taking-app
. Ini yang menyebabkan masalah.Larutan
Itu sudah lama bertele-tele - tetapi solusinya adalah:
PUBLIC_URL
variabel env tergantung pada lingkunganhomepage
properti daripackage.json
fileDi bawah ini adalah
.env-cmdrc
file saya . Saya menggunakan.env-cmdrc
lebih dari biasa.env
karena menyimpan semuanya bersama dalam satu file.Routing via
react-router-dom
works fine too - cukup gunakanPUBLIC_URL
variabel env sebagaibasename
properti.Konfigurasi server diatur untuk merutekan semua permintaan ke
./index.html
file.Akhirnya, inilah
main.fc70b10f.chunk.css
tampilan file yang dikompilasi setelah perubahan yang dibahas diimplementasikan.Bahan bacaan
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
variabel lingkungansumber