Mengoptimalkan font web

Dalam modul sebelumnya, Anda telah mempelajari cara mengoptimalkan HTML, CSS, JavaScript, dan resource media. Dalam modul ini, temukan beberapa metode untuk mengoptimalkan font web.

Font web dapat memengaruhi performa halaman pada waktu pemuatan dan waktu rendering. File font besar dapat memerlukan waktu beberapa saat untuk didownload dan berdampak negatif pada First Contentful Paint (FCP), sedangkan nilai font-display yang salah dapat menyebabkan pergeseran tata letak yang tidak diinginkan yang berkontribusi pada Pergeseran Tata Letak Kumulatif (CLS) halaman.

Sebelum mengoptimalkan font web dapat dibahas, mengetahui cara font ditemukan oleh browser akan sangat membantu, sehingga Anda dapat memahami cara CSS mencegah pengambilan font web yang tidak diperlukan dalam situasi tertentu.

Discovery

Font web halaman ditentukan dalam style sheet menggunakan deklarasi @font-face:

@font-face {
  font-family: "Open Sans";
  src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2");
}

Cuplikan kode sebelumnya menentukan font-family yang bernama "Open Sans", dan memberi tahu browser tempat menemukan resource font web masing-masing. Untuk menghemat bandwidth, browser tidak mendownload font web sampai ditetapkan bahwa tata letak halaman saat ini memerlukannya.

h1 {
  font-family: "Open Sans";
}

Dalam cuplikan CSS sebelumnya, browser mendownload file font "Open Sans" saat mengurai elemen <h1> di HTML halaman.

preload

Jika deklarasi @font-face Anda ditetapkan dalam style sheet eksternal, browser hanya dapat mulai mendownloadnya setelah mendownload style sheet. Hal ini membuat font web menjadi resource yang jarang ditemukan—tetapi ada cara untuk membantu browser menemukan font web lebih cepat.

Anda dapat memulai permintaan awal untuk resource font web menggunakan perintah preload. Perintah preload membuat font web dapat ditemukan lebih awal selama pemuatan halaman, dan browser akan langsung mulai mendownloadnya tanpa menunggu style sheet selesai mendownload dan mengurai. Perintah preload tidak menunggu sampai font diperlukan di halaman.

<!-- The `crossorigin` attribute is required for fonts—even
     self-hosted ones, as fonts are considered CORS resources. -->
<link rel="preload" as="font" href="/fonts/OpenSans-Regular-webfont.woff2" crossorigin>

Deklarasi @font-face inline

Anda dapat membuat font dapat ditemukan lebih awal selama pemuatan halaman dengan membuat CSS pemblokir render—termasuk deklarasi @font-face—menjadi inline di <head> HTML menggunakan elemen <style>. Dalam hal ini, browser akan menemukan font web lebih awal di pemuatan halaman, karena tidak perlu menunggu style sheet eksternal untuk didownload.

Penyertaan deklarasi @font-face memiliki keunggulan dibandingkan penggunaan petunjuk preload, karena browser hanya mendownload font yang diperlukan untuk merender halaman saat ini. Tindakan ini akan mengurangi risiko mendownload font yang tidak digunakan.

Download

Setelah menemukan font web dan memastikan font tersebut diperlukan oleh tata letak halaman saat ini, browser dapat mendownloadnya. Jumlah font web, encoding-nya, dan ukuran filenya dapat sangat memengaruhi seberapa cepat font web didownload dan dirender oleh browser.

Hosting sendiri font web Anda

Font web dapat ditampilkan melalui layanan pihak ketiga, seperti Google Fonts, atau dapat dihosting sendiri di origin Anda. Saat menggunakan layanan pihak ketiga, halaman web Anda harus membuka koneksi ke domain penyedia agar dapat mulai mendownload font web yang diperlukan. Hal ini dapat menunda penemuan dan download font web berikutnya.

Overhead ini dapat dikurangi menggunakan petunjuk resource preconnect. Dengan menggunakan preconnect, Anda dapat memberi tahu browser untuk membuka koneksi ke lintas asal lebih cepat daripada biasanya:

<link rel="preconnect" href="https://fonts.googleapis.com">  
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>

Cuplikan HTML sebelumnya memberi petunjuk browser untuk membuat koneksi ke fonts.googleapis.com dan koneksi CORS ke fonts.gstatic.com. Beberapa penyedia font—seperti Google Fonts—menyajikan resource CSS dan font dari asal yang berbeda.

Anda dapat menghilangkan kebutuhan akan koneksi pihak ketiga dengan menghosting sendiri font web Anda. Dalam sebagian besar kasus, font web yang di-hosting sendiri lebih cepat daripada mendownloadnya dari lintas asal. Jika Anda berencana untuk menghosting sendiri font web, pastikan situs Anda menggunakan Jaringan Penayangan Konten (CDN), HTTP/2, atau HTTP/3, dan tetapkan header cache yang benar untuk font web yang Anda perlukan untuk situs.

Gunakan WOFF2—dan WOFF2 saja

WOFF2 menikmati dukungan browser yang luas dan kompresi terbaik—hingga 30% lebih baik daripada WOFF. Berkurangnya ukuran file akan mempercepat waktu download. Format WOFF2 sering kali merupakan satu-satunya yang diperlukan untuk kompatibilitas penuh di seluruh browser modern.

Subset font web Anda

Font web biasanya mencakup berbagai glyph, yang diperlukan untuk mewakili beragam karakter yang digunakan dalam berbagai bahasa. Jika halaman hanya menayangkan konten dalam satu bahasa atau menggunakan satu alfabet, Anda dapat mengurangi ukuran font web melalui subsetelan. Hal ini sering dilakukan dengan menentukan angka—atau rentang—titik kode unicode.

Subset adalah kumpulan glyph yang dikurangi yang disertakan dalam file font web asli. Misalnya, halaman Anda mungkin menayangkan subset tertentu untuk karakter Latin, bukan menampilkan semua glyph. Bergantung pada subset yang diperlukan, menghapus glyph dapat mengurangi ukuran file font secara signifikan.

Beberapa penyedia font web, seperti Google Fonts, menawarkan subkumpulan secara otomatis melalui penggunaan parameter string kueri. Misalnya, URL https://fonts.googleapis.com/css?family=Roboto&subset=latin menayangkan style sheet dengan font web Roboto yang hanya menggunakan alfabet Latin.

Jika Anda memutuskan untuk menghosting sendiri font web Anda, langkah berikutnya adalah membuat dan menghosting sendiri subset tersebut menggunakan alat seperti glyphanger atau subfont.

Namun, jika tidak dapat menghosting sendiri font web Anda sendiri, Anda dapat membuat subset font web yang disediakan oleh Google Fonts dengan menentukan parameter string kueri text tambahan yang hanya berisi poin kode unicode yang diperlukan untuk situs Anda. Misalnya, jika Anda memiliki font web tampilan di situs yang hanya memerlukan sedikit karakter yang diperlukan untuk frasa "Selamat Datang", Anda dapat meminta subset tersebut melalui Google Fonts melalui URL berikut: https://fonts.googleapis.com/css?family=Monoton&text=Welcome. Hal ini dapat secara signifikan mengurangi jumlah data font web yang diperlukan untuk satu jenis huruf di situs Anda, jika subsetelan ekstrem tersebut dapat berguna untuk situs Anda.

Rendering font

Setelah menemukan dan mendownload font web, browser dapat dirender. Secara default, browser memblokir rendering teks apa pun yang menggunakan font web hingga didownload. Anda dapat menyesuaikan perilaku rendering teks browser, dan mengonfigurasi teks apa yang harus ditampilkan—atau tidak ditampilkan—sampai font web dimuat sepenuhnya menggunakan properti CSS font-display.

block

Nilai default untuk font-display adalah block. Dengan block, browser memblokir rendering teks apa pun yang menggunakan font web yang ditentukan. Setiap browser memiliki perilaku yang sedikit berbeda. Chromium dan Firefox memblokir rendering hingga maksimum 3 detik sebelum menggunakan penggantian. Safari memblokir tanpa batas waktu hingga font web dimuat.

swap

swap adalah nilai font-display yang paling banyak digunakan. swap tidak memblokir rendering, dan menampilkan teks langsung dalam penggantian sebelum menukar dalam font web yang ditentukan. Dengan begitu, Anda dapat langsung menampilkan konten tanpa menunggu font web didownload.

Namun, kelemahan dari swap adalah menyebabkan pergeseran tata letak jika font web penggantian dan font web yang ditentukan dalam CSS Anda sangat bervariasi dalam hal tinggi baris, kerning, dan metrik font lainnya. Hal ini dapat memengaruhi CLS situs jika Anda tidak berhati-hati dalam menggunakan petunjuk preload untuk memuat resource font web sesegera mungkin, atau jika Anda tidak mempertimbangkan nilai font-display lainnya.

fallback

Nilai fallback untuk font-display adalah kompromi antara block dan swap. Tidak seperti swap, browser memblokir rendering font, tetapi bertukar dengan teks pengganti hanya untuk jangka waktu yang sangat singkat. Namun, tidak seperti block, periode pemblokiran sangat singkat.

Penggunaan nilai fallback dapat berfungsi dengan baik di jaringan cepat, yang jika font web didownload dengan cepat, font web adalah jenis huruf yang langsung digunakan pada rendering awal halaman. Namun, jika jaringan lambat, teks penggantian akan terlihat terlebih dahulu setelah periode pemblokiran berlalu, lalu ditukar saat font web tiba.

optional

optional adalah nilai font-display yang paling ketat, dan hanya menggunakan resource font web jika didownload dalam waktu 100 milidetik. Jika font web memerlukan waktu lebih lama untuk dimuat, font tersebut tidak akan digunakan di halaman, dan browser menggunakan jenis huruf fallback untuk navigasi saat ini sementara font web didownload di latar belakang dan ditempatkan di cache browser.

Akibatnya, navigasi halaman berikutnya dapat langsung menggunakan font web, karena sudah didownload. font-display: optional menghindari pergeseran tata letak yang terlihat dengan swap, tetapi beberapa pengguna tidak melihat font web jika terlambat muncul di navigasi halaman awal.

Demo font

Menguji pengetahuan Anda

Kapan browser mendownload resource font web (dengan asumsi bahwa resource tersebut tidak diambil dengan perintah preload)?

Segera setelah referensinya ditemukan di lembar gaya.
Coba lagi.
Ketika WebView halaman dibuat dan ditentukan bahwa font web diperlukan untuk tata letak saat ini.
Benar.

Apa satu-satunya format (dan paling efisien) yang diperlukan untuk menyediakan font web ke semua browser modern?

WOFF2
Benar.
WOFF
Coba lagi.
TTF
Coba lagi.
pada akhir jam kerja
Coba lagi.

Berikutnya: JavaScript pemisahan kode

Setelah memahami pengoptimalan font, Anda kini dapat melanjutkan ke modul berikutnya, yang membahas topik yang memiliki potensi tinggi untuk meningkatkan kecepatan pemuatan halaman awal bagi pengguna Anda, yaitu menunda pemuatan JavaScript melalui pemisahan kode. Dengan demikian, Anda dapat menjaga bandwidth dan pertentangan CPU serendah mungkin selama fase memulai halaman, periode waktu saat pengguna kemungkinan besar berinteraksi dengan halaman.