Bazı HTTP istekleri şunları içerir:
Range: başlık, tam kaynağın yalnızca bir kısmının döndürülmesi gerektiğini belirtir. Uzak dosyanın tamamını bir kerede istemek yerine, daha küçük ortam parçalarının isteğe bağlı olarak yüklenmesine izin vermek için ses veya video içeriği akışı için yaygın olarak kullanılırlar.
A hizmet çalışanı web uygulamanız ile ağ arasında yer alan, potansiyel olarak giden ağ isteklerini yakalayan ve bunlar için yanıtlar oluşturan JavaScript kodudur.
Tarihsel olarak, menzil talepleri ve servis çalışanları birlikte iyi oynamadı. Servis çalışanınızda kötü sonuçlarla karşılaşmamak için özel adımlar atmak gerekli olmuştur. Neyse ki, bu değişmeye başlıyor. Doğru davranışı sergileyen tarayıcılarda, aralık istekleri bir hizmet çalışanından geçerken “yalnızca çalışır”.
Sorun nedir? #
Aşağıdaki özelliklere sahip bir servis çalışanı düşünün
fetch gelen her isteği alan ve ağa ileten olay dinleyicisi:
self.addEventListener('fetch', (event) => {
// The Range: header will not pass through in
// browsers that behave incorrectly.
event.respondWith(fetch(event.request));
});
Yanlış davranışa sahip tarayıcılarda, eğer
event.request dahil bir
Range: başlık, bu başlık sessizce bırakılacaktır. Uzak sunucu tarafından alınan istek şunları içermez:
Range: hiç. Bu, herhangi bir şeyi “kırmak” zorunda değildir, çünkü bir sunucu teknik olarak ile tam yanıt gövdesini döndürmesine izin verilir.
200 durum kodune zaman bir
Range: Başlık orijinal istekte mevcut. Ancak bu, tarayıcı açısından kesinlikle gerekenden daha fazla verinin aktarılmasına neden olur.
Bu davranışın farkında olan geliştiriciler, bir davranışın varlığını açık bir şekilde kontrol ederek sorunu çözebilir.
Range: başlık ve arama değil
event.respondWith() eğer biri mevcutsa. Bunu yaparak, hizmet çalışanı kendisini yanıt oluşturma resminden etkili bir şekilde kaldırır ve bunun yerine aralık isteklerini nasıl koruyacağını bilen varsayılan tarayıcı ağ mantığı kullanılır.
self.addEventListener('fetch', (event) => {
// Return without calling event.respondWith()
// if this is a range request.
if (event.request.headers.has('range')) {
return;
}
event.respondWith(fetch(event.request));
});
Yine de çoğu geliştiricinin bunu yapma ihtiyacının farkında olmadığını söylemek güvenlidir. Ve net değildi Neden bu gerekli olmalı. Sonuçta, bu sınırlama nedeniyle oldu tarayıcılar yetişmek gerek temel spesifikasyondaki değişikliklerbu işlevsellik için destek ekledi.
Neler düzeltildi? #
Doğru davranan tarayıcılar,
Range: başlık ne zaman
event.request geçirilir
fetch(). Bu, ilk örneğimdeki hizmet çalışanı kodunun uzak sunucunun
Range: başlık, tarayıcı tarafından ayarlandıysa:
self.addEventListener('fetch', (event) => {
// The Range: header will pass through in browsers
// that behave correctly.
event.respondWith(fetch(event.request));
});
Sunucu artık aralık isteğini düzgün bir şekilde işleme ve kısmi bir yanıt döndürme şansı elde eder.
206 durum kodu.
Hangi tarayıcılar doğru davranıyor? #
Ekim 2020 itibarıyla Firefox bu davranışı henüz düzeltmedi, bu nedenle hizmet çalışanınızın kodunu üretime dağıtırken yine de hesaba katmanız gerekebilir.
“Aralık başlığını ağ isteğine dahil et” satırının kontrol edilmesi Web Platformu Testleri panosu belirli bir tarayıcının bu davranışı düzeltip düzeltmediğini doğrulamanın en iyi yoludur.
Önbellekten aralık istekleri sunmaya ne dersiniz? #
Hizmet çalışanları, bir isteği ağa iletmekten çok daha fazlasını yapabilir. Yaygın bir kullanım durumu, ses ve video dosyaları gibi kaynakları bir yerel önbellek. Bir hizmet çalışanı daha sonra, ağı tamamen atlayarak bu önbellekten gelen istekleri karşılayabilir.
Firefox da dahil olmak üzere tüm tarayıcılar, bir istek içindeki bir isteği incelemeyi destekler.
fetch işleyici, varlığını kontrol ederek
Range: başlık ve ardından isteği yerel olarak bir
206 cevap bu bir önbellekten gelir. Doğru şekilde ayrıştırmak için hizmet çalışanı kodu
Range: başlık ve tam önbelleğe alınmış yanıtın yalnızca uygun bölümünü döndürmek, yine de önemsiz değildir.
Neyse ki, yardım isteyen geliştiriciler çalışma kutusu, yaygın hizmet çalışanı kullanım durumlarını basitleştiren bir dizi kitaplıktır. bu
workbox-range-request module kısmi yanıtları doğrudan önbellekten sunmak için gerekli tüm mantığı uygular. Bu kullanım durumu için tam bir tarif bulunabilir Workbox belgelerinde.
Bu gönderideki kahraman resmi, Natalie Rhea Riggs Unsplash’ta.