Erken İpuçları ile sunucu düşünme zamanı sayesinde sayfalar daha hızlı yüklenir

Sunucunuzun tarayıcıya kritik alt kaynaklarla ilgili ipuçları nasıl gönderebileceğini öğrenin.

Kenji Baheux
Kenji Baheux

Erken ipuçları nedir?

Web siteleri zaman içinde daha karmaşık hale geldi. Bu nedenle, bir sunucunun istenen sayfanın HTML'sini oluşturmak için basit olmayan işlemler (ör. veritabanlarına erişim veya kaynak sunucuya erişen CDN'ler) yapması normaldir. Maalesef bu "sunucu düşünme süresi", tarayıcı sayfayı oluşturmaya başlamadan önce ek gecikmeye neden olur. Gerçekten de, sunucunun yanıtı hazırlaması kadar bağlantı etkin bir şekilde boşta kalır.

Sayfanın yüklenmesi ile diğer kaynakların yüklenmesi arasındaki 200 ms'lik sunucu düşünme süresi aralığını gösteren resim.
Erken İpuçları olmadan: Ana kaynak için nasıl yanıt verileceğini belirleyen sunucudaki her şey engellenir.

Erken İpuçları, nihai yanıttan önce ön bir HTTP yanıtı göndermek için kullanılan bir HTTP durum kodudur (103 Early Hints). Bu sayede sunucu, ana kaynağı oluşturmakla meşgulken tarayıcıya kritik alt kaynaklar (ör. sayfanın stil sayfaları, kritik JavaScript) veya sayfa tarafından büyük olasılıkla kullanılacak kökler hakkında ipuçları gönderebilir. Tarayıcı, ana kaynağı beklerken bağlantıları ısıtmak için bu ipuçlarını kullanabilir ve alt kaynaklar isteyebilir. Diğer bir deyişle, erken ipuçları, tarayıcıya bazı çalışmaları önceden yaparak bu tür "sunucu düşünme süresinden" yararlanmasına yardımcı olur ve böylece sayfa yüklemelerini hızlandırır.

Erken İpuçları'nın sayfanın kısmi yanıt göndermesine nasıl olanak tanıdığını gösteren resim.
Erken İpuçları ile: Sunucu, nihai yanıtı belirlerken kaynak ipuçlarıyla kısmi bir yanıt yayınlayabilir

Bazı durumlarda, Largest Contentful Paint'te elde edilen performans artışı Shopify ve Cloudflare tarafından gözlemlendiği üzere birkaç yüz milisaniyeden bir saniyeye kadar çıkabilir. Bu karşılaştırmada da görüldüğü gibi:

İki sitenin karşılaştırması.
WebPageTest ile yapılan bir test web sitesindeki Erken İpuçları'nın "Önce/Sonra" karşılaştırması (Moto G4 - DSL)

Erken ipuçları nasıl kullanılır?

Erken İpuçları'ndan yararlanmanın ilk adımı, en başarılı açılış sayfalarını yani kullanıcılarınızın web sitenizi ziyaret ettiğinde genellikle başladıkları sayfaları belirlemektir. Bu, ana sayfa veya diğer web sitelerinden gelen çok sayıda kullanıcınız varsa popüler ürün listeleme sayfaları olabilir. Bu giriş noktalarının diğer sayfalardan daha önemli olmasının nedeni, kullanıcı web sitenizde gezindikçe Erken İpuçları'nın yararlılığının azalmasıdır (yani, tarayıcının ikinci veya üçüncü gezinme sırasında ihtiyaç duyduğu tüm alt kaynaklara sahip olma olasılığı daha yüksektir). Muhteşem bir ilk izlenim yaratmak da her zaman iyi bir fikirdir.

Bu öncelikli açılış sayfaları listesine sahip olduğunuza göre, bir sonraki adım preconnect veya preload ipuçları için hangi kaynakların veya alt kaynakların iyi aday olduğunu belirlemektir. Bunlar genellikle Largest Contentful Paint veya First Contentful Paint gibi temel kullanıcı metriklerine en çok katkıda bulunan kaynaklar ve alt kaynaklardır. Daha net bir şekilde belirtmek gerekirse, eşzamanlı JavaScript, stil sayfaları ve hatta web yazı tipleri gibi oluşturmayı engelleyen alt kaynakları arayın. Benzer şekilde, önemli kullanıcı metriklerine çok fazla katkıda bulunan alt kaynakları barındıran kaynakları arayın.

Ayrıca, ana kaynaklarınızda preconnect veya preload kullanılıyorsa Erken İpuçlarına adaylar arasında bu kaynakları ya da kaynakları göz önünde bulundurabilirsiniz. Daha fazla ayrıntı için LCP'yi nasıl optimize edeceğinizi öğrenin. Ancak preconnect ve preload yönergelerini HTML'den Erken İpuçları'na kopyalamanın en iyi seçenek olmayabileceği unutulmamalıdır.

Bunları HTML'de kullanırken genellikle Ön Yükleme Tarayıcı'nın HTML'de keşfetmeyeceği kaynakları (ör. aksi takdirde geç keşfedilecek yazı tipleri veya arka plan resimleri) preconnect veya preload etmek istersiniz. Erken ipuçları için HTML'niz olmaz. Bu nedenle, kritik alanlara veya olası başka bir durumda HTML'nin başlarında keşfedilecek kritik kaynaklara preconnect yapmak isteyebilirsiniz. Örneğin, main.css veya app.js'i önceden yükleyebilirsiniz. Ayrıca, tüm tarayıcılar erken ipuçları için preload'yi desteklemez. Tarayıcı desteği bölümüne bakın.

İkinci adım, eski veya artık ana kaynak tarafından kullanılmayan kaynaklarda ya da kaynaklarda Erken İpuçları kullanma riskini en aza indirmekten oluşur. Örneğin, sık sık güncellenen ve sürümlendirilen kaynaklar (ör. example.com/css/main.fa231e9c.css) en iyi seçenek olmayabilir. Bu sorunun erken ipuçlarına özgü olmadığını, nerede olursa olsun tüm preload veya preconnect için geçerli olduğunu unutmayın. Bu tür ayrıntılar, otomasyon veya şablonlama ile en iyi şekilde ele alınır (örneğin, manuel bir işlemle preload ile kaynağı kullanan gerçek HTML etiketi arasında eşleşmeyen karma veya sürüm URL'leri oluşma olasılığı daha yüksektir).

Örneğin, aşağıdaki akışı ele alalım:

GET /main.html
Host: example.com
User-Agent: [....] Chrome/103.0.0.0 [...]

Sunucu, main.abcd100.css'e ihtiyaç duyulacağını tahmin eder ve Erken İpuçları'nı kullanarak bu öğeyi önceden yüklemeyi önerir:

103 Early Hints
Link: </main.abcd100.css>; rel=preload; as=style
[...]

Birkaç dakika sonra, bağlı CSS dahil olmak üzere web sayfası yayınlanır. Maalesef bu CSS kaynağı sık sık güncellenir ve ana kaynak zaten tahmin edilen CSS kaynağının (abcd100) beş sürümü (abcd105) ilerisindedir.

200 OK
[...]
<HTML>
<head>
   <title>Example</title>
   <link rel="stylesheet" href="/main.abcd105.css">

Genel olarak, oldukça kararlı ve büyük ölçüde ana kaynağın sonucundan bağımsız kaynaklar ve kökenler kullanmayı hedefleyin. Gerekirse önemli kaynaklarınızı ikiye ayırabilirsiniz: İlk İpuçlarıyla kullanılmak üzere tasarlanmış sabit bir bölüm ve ana kaynak tarayıcı tarafından alındıktan sonra getirilecek daha dinamik bir bölüm bırakılacaktır:

<HTML>
<head>
   <title>Example</title>
   <link rel="stylesheet" href="/main.css">
   <link rel="stylesheet" href="/experimental.3eab3290.css">

Son olarak, sunucu tarafında, erken ipuçlarını desteklediği bilinen tarayıcılar tarafından gönderilen ana kaynak isteklerini arayın ve 103 erken ipucu ile hemen yanıt verin. 103 yanıtına, ilgili önceden bağlanma ve önceden yükleme ipuçlarını ekleyin. Ana kaynak hazır olduğunda, normal yanıtı (örneğin, başarılıysa 200 OK) gönderin. Geriye dönük uyumluluk için nihai yanıta Link HTTP üstbilgilerini de eklemek iyi bir uygulamadır. Hatta ana kaynağın oluşturulması sırasında ortaya çıkan kritik kaynaklarla (ör. "ikiye bölme" önerisini uyguladıysanız önemli bir kaynağın dinamik kısmı) bu üstbilgileri destekleyebilirsiniz. Bu durum aşağıdaki gibi görünür:

GET /main.html
Host: example.com
User-Agent: [....] Chrome/103.0.0.0 [...]
103 Early Hints
Link: <https://fonts.google.com>; rel=preconnect
Link: </main.css>; rel=preload; as=style
Link: </common.js>; rel=preload; as=script

Birkaç dakika sonra:

200 OK
Content-Length: 7531
Content-Type: text/html; charset=UTF-8
Content-encoding: br
Link: <https://fonts.google.com>; rel=preconnect
Link: </main.css>; rel=preload; as=style
Link: </common.js>; rel=preload; as=script
Link: </experimental.3eab3290.css>; rel=preload; as=style
<HTML>
<head>
   <title>Example</title>
   <link rel="stylesheet" href="/main.css">
   <link rel="stylesheet" href="/experimental.3eab3290.css">
   <script src="/common.js"></script>
   <link rel="preconnect" href="https://fonts.googleapis.com">

Tarayıcı desteği

103 Erken İpucu tüm büyük tarayıcılarda desteklenir ancak Erken İpucu'nda gönderilebilecek yönergeler tarayıcıya göre değişiklik gösterir:

Önceden bağlantı desteği:

Tarayıcı desteği

  • Chrome: 103.
  • Kenar: 103.
  • Firefox: 120.
  • Safari: 17.

Ön yükleme desteği:

Tarayıcı Desteği

  • Chrome: 103.
  • Edge: 103.
  • Firefox: 123.
  • Safari: Desteklenmez.

Chrome Geliştirici Araçları'nda 103 Erken İpucu desteği de vardır ve Link üstbilgileri belge kaynaklarında görülebilir:

İlk İpuçları Başlıklarının gösterildiği ağ paneli
Chrome Geliştirici Araçları'nda İlk İpucu Link başlıkları gösterilir.

Erken İpuçları kaynaklarını kullanmak için Erken İpuçları tarayıcı önbelleğini kullandığından DevTools'ta Disable cache işaretlenmemelidir. Önceden yüklenmiş kaynaklarda başlatıcı early-hints, boyut ise (Disk cache) olarak gösterilir:

İlk İpuçlarını başlatanların gösterildiği ağ paneli
Erken ipucu içeren kaynaklarda early-hints başlatıcı bulunur ve bu kaynaklar disk önbelleğinden yüklenir.

Bu işlem ayrıca HTTPS testi için güvenilir bir sertifika gerektirir.

Firefox'ta (126 sürümü itibarıyla) DevTools'ta 103 Erken İpucu desteği açıkça belirtilmemiştir ancak Erken İpuçları kullanılarak yüklenen kaynaklar, Erken İpuçları ile yüklendiklerinin bir göstergesi olan HTTP üstbilgisi bilgilerini göstermez.

Sunucu desteği

Popüler açık kaynak yazılım HTTP sunucusu yazılımları arasında Erken İpuçları desteğinin düzeyine dair kısa bir özet aşağıda verilmiştir:

Erken İpuçlarını daha kolay şekilde etkinleştirin

Aşağıdaki CDN'lerden veya platformlardan birini kullanıyorsanız erken ipuçları özelliğini manuel olarak uygulamanız gerekmeyebilir. İlk İpuçlarını destekleyip desteklemediğini öğrenmek için çözüm sağlayıcınızın online belgelerine bakın veya buradaki olası her örneğe yer verilmemiş olan listeyi inceleyin:

Erken İpuçları'nı desteklemeyen istemcilerde sorunları önleme

100 aralığındaki bilgilendirici HTTP yanıtları HTTP standardının bir parçasıdır ancak 103 Erken İpuçları kullanıma sunulmadan önce genel web tarayıcılığı için nadiren kullanıldıkları için bazı eski istemciler veya botlar bunlarla ilgili sorun yaşayabilir.

Yalnızca sec-fetch-mode: navigate HTTP istek üstbilgisi gönderen istemcilere yanıt olarak 103 Erken İpucu göndermek, bu tür ipuçlarının yalnızca sonraki yanıtı beklemeyi anlayan yeni istemcilere gönderilmesini sağlar. Ayrıca, erken ipuçları yalnızca gezinme isteklerinde desteklendiğinde (mevcut sınırlamalara bakın) bu, diğer isteklerde gereksiz yere gönderilmesini önleme avantajına da sahiptir.

Ayrıca, Erken İpuçları'nın yalnızca HTTP/2 veya HTTP/3 bağlantıları üzerinden gönderilmesi önerilir ve çoğu tarayıcı bunları yalnızca bu protokoller üzerinden kabul eder.

Gelişmiş desen

Erken İpuçları'nı önemli açılış sayfalarınıza tam olarak uyguladıysanız ve daha fazla fırsat arıyorsanız aşağıdaki gelişmiş kalıbı kullanabilirsiniz.

Tipik bir kullanıcı yolculuğunun bir parçası olarak n. sayfa isteğinde bulunan ziyaretçiler için Erken İpuçları yanıtını sayfada daha az ve daha derinde yer alan içeriğe uyarlamak, başka bir deyişle daha düşük öncelikli kaynaklarda Erken İpuçları'nı kullanmak isteyebilirsiniz. Yüksek öncelikli, oluşturmayı engelleyen alt kaynaklara veya kaynaklara odaklanmanızı önerdiğimiz için bu durum mantıksız gelebilir. Ancak bir ziyaretçi sitenizde bir süre gezindikten sonra tarayıcıda tüm önemli kaynakların bulunması muhtemeldir. Bu noktadan sonra, dikkatinizi daha düşük öncelikli kaynaklara çevirmeniz mantıklı olabilir. Örneğin, bu durum ürün resimlerini yüklemek için erken ipuçları veya yalnızca daha az yaygın kullanıcı etkileşimleri için gereken ek JS/CSS kullanmak anlamına gelebilir.

Mevcut sınırlamalar

Chrome'da uygulanan erken ipuçlarıyla ilgili sınırlamalar aşağıda verilmiştir:

  • Yalnızca gezinme istekleri (yani üst düzey dokümanın ana kaynağı) için kullanılabilir.
  • Yalnızca preconnect ve preload desteklenir (yani prefetch desteklenmez).
  • İlk İpuçları ve ardından son yanıtta kaynaklar arası yönlendirme, Chrome'un Erken İpuçlarını kullanarak edindiği kaynakları ve bağlantıları bırakmasına neden olur.
  • Erken İpuçları kullanılarak önceden yüklenen kaynaklar HTTP önbelleğine depolanır ve daha sonra sayfa tarafından buradan alınır. Bu nedenle, yalnızca ön ipuçlarını kullanarak ön yüklenebilen kaynaklar ön yüklenebilir. Aksi takdirde kaynak iki kez getirilir (ön ipuçları tarafından bir kez, doküman tarafından tekrar). Chrome'da, güvenilir olmayan HTTPS sertifikaları için HTTP önbelleği devre dışı bırakılır (sayfayı yükleseniz bile).
  • Uyumlu resimlerin önceden yüklenmesi (imagesrcset, imagesizes veya media kullanılarak), doküman oluşturulana kadar görüntü alanı tanımlanmadığından HTTP <link> üstbilgileri kullanılarak desteklenmez. Bu, 103 erken ipucunun duyarlı resimleri önceden yüklemek için kullanılamayacağı ve bu amaçla kullanıldığında yanlış resmi yükleyebileceği anlamına gelir. Bu sorunu daha iyi nasıl çözeceğinizle ilgili öneriler hakkındaki tartışmayı takip edin.

Diğer tarayıcılarda da benzer sınırlamalar vardır ve daha önce belirtildiği gibi bazı tarayıcılar 103 erken ipucunu yalnızca preconnect ile kısıtlar.

Sırada ne var?

Topluluğun ilgisine bağlı olarak, erken ipuçları uygulamamızı aşağıdaki özelliklerle genişletebiliriz:

  • HTTP önbelleği yerine bellek önbelleğini kullanan önbelleğe alınamayan kaynaklar için erken ipuçları.
  • Alt kaynak isteklerinde gönderilen erken ipuçları.
  • iframe ana kaynak isteklerinde gönderilen erken ipuçları.
  • Erken İpuçları'nda ön getirme desteği.

Öncelik verilecek konular ve erken ipuçlarının nasıl daha da iyileştirileceği hakkında geri bildirimlerinizi bekliyoruz.

H2/Push ile ilişkisi

Desteği sonlandırılan HTTP2/Push özelliği hakkında bilginiz varsa Erken İpuçları'nın bu özellikten farkının ne olduğunu merak edebilirsiniz. Erken İpuçları, tarayıcı için kritik alt kaynakları getirmeye başlamak üzere bir gidiş dönüş gerektirirken HTTP2/Push ile sunucu, yanıtla birlikte alt kaynakları göndermeye başlayabilir. Bu durum kulağa harika gelse de önemli bir yapısal dezavantaja neden oldu: HTTP2/Push ile, tarayıcıda zaten bulunan alt kaynakların gönderilmesini önlemek son derece zordu. Bu "aşırı zorlama" etkisi, ağ bant genişliğinin daha az verimli kullanılmasına neden olarak performans avantajlarını önemli ölçüde engelledi. Genel olarak Chrome verileri, HTTP2/Push'in aslında web genelinde performans açısından net bir olumsuz etki yarattığını gösterdi.

Buna karşılık, erken ipuçları, ön yanıt gönderme özelliğini, tarayıcıya gerçekten ihtiyaç duyduğu bilgileri getirme veya bunlara bağlanma görevini veren ipuçlarıyla birleştirdiği için pratikte daha iyi performans gösterir. Erken İpuçları, HTTP2/Push'in teoride ele alabileceği tüm kullanım alanlarını kapsamasa da gezinmeleri hızlandırmak için daha pratik bir çözüm olduğuna inanıyoruz.

Pierre Bamin tarafından oluşturulan küçük resim.