Bu kılavuz, Workbox v3'te kullanıma sunulan değişikliklere odaklanmaktadır ve Workbox v2 kurulumundan yükseltme yaparken yapmanız gereken değişikliklere ilişkin örnekler içerir.
Şu anda eski sw-precache
/sw-toolbox
kombinasyonunu kullanıyor ve Workbox'a ilk kez geçiş yapmak istiyorsanız size yardımcı olabilecek farklı bir taşıma rehberinden yararlanabilirsiniz.
v3 Arka Planı
Workbox'ın v3 sürümü, mevcut kod tabanında önemli bir yeniden düzenleme yapılmasını temsil ediyor. Kapsayıcı hedefler şunlardır:
- Çalışma Kutusu'nun boyutunu en aza indirin. İndirilen ve yürütülen Service Worker çalışma zamanı kodu miktarı azaltıldı. Herkesi monolitik bir pakete dahil etmek yerine çalışma zamanında yalnızca kullandığınız belirli özelliklerin kodu içe aktarılır.
- Workbox'ta CDN bulunur. Workbox çalışma zamanı kitaplıklarına erişim için standart seçenek olarak tam desteklenen, Google Cloud Storage tabanlı CDN barındırma hizmeti sunuyoruz. Bu sayede, Workbox'ın çalışmaya başlaması kolaylaşır.
- Daha iyi hata ayıklama ve günlük kaydı. Hata ayıklama ve günlük kaydı deneyimi büyük ölçüde iyileştirildi. Bir
localhost
kaynağından Çalışma Kutusu kullanıldığında ve tüm günlük kaydı ile onaylamalar üretim derlemelerinden kaldırıldığında hata ayıklama günlükleri varsayılan olarak etkinleştirilir. - İyileştirilmiş web paketi eklentisi.
workbox-webpack-plugin
, web paketi derleme sürecine daha yakın şekilde entegre olarak, derleme ardışık düzenindeki tüm öğeleri önbelleğe almak istediğinizde sıfır yapılandırma kullanım alanına olanak tanır.
Bu hedeflere ulaşmak ve önceki arayüzün tuhaf gelen veya anti kalıplara yol açan bazı yönlerini temizlemek; v3 sürümünde yıkıcı birkaç değişiklik yapılması gerekiyordu.
Zarar Veren Değişiklikler
Derleme Yapılandırması
Aşağıdaki değişiklikler, ortak bir yapılandırma seçeneği grubunu paylaşan tüm derleme araçlarımızın (workbox-build
, workbox-cli
, workbox-webpack-plugin
) davranışını etkiler.
'fastest'
işleyici adı daha önce geçerliydi veruntimeCaching
yapılandırılırken'staleWhileRevalidate'
için takma ad olarak değerlendiriliyordu. Artık geçerli değil ve geliştiricilerin doğrudan'staleWhileRevalidate'
kullanmaya başlaması gerekiyor.- Birkaç
runtimeCaching.options
özellik adı güncellendi. Ayrıca, geçersiz yapılandırma kullanılırsa derlemenin başarısız olmasına yol açacak ek parametre doğrulaması da kullanılıyor. Şu anda desteklenen seçeneklerin listesi içinruntimeCaching
belgelerine bakın.
workbox-background-sync
maxRetentionTime
yapılandırma parametresi artık milisaniye sayısı yerine dakika sayısı olarak yorumlanıyor.- Artık sıra adını temsil eden zorunlu bir dize bulunmaktadır. Bu dize, Eklenti veya bağımsız sınıf oluşturulurken ilk parametre olarak iletilmesi gerekir. (Bu, daha önce seçeneklerin bir özelliği olarak geçiriliyordu.) Güncellenmiş API yüzeyi için belgeleri inceleyin.
workbox-broadcast-cache-update
- Artık Eklenti veya bağımsız sınıf oluşturulurken ilk parametre olarak aktarılması gereken, kanal adını temsil eden zorunlu bir dize bulunmaktadır.
Örneğin, v2'de Eklenti sınıfını şu şekilde başlatırsınız:
new workbox.broadcastCacheUpdate.BroadcastCacheUpdatePlugin({
channelName: 'cache-updates',
headersToCheck: ['etag'],
});
v3'te eşdeğer kullanım:
new workbox.broadcastUpdate.Plugin('cache-updates', {headersToCheck: ['etag']});
Güncellenmiş API yüzeyi için belgeleri inceleyin.
workbox-build
- Varsayılan olarak,
glob
kalıp eşleştirme artıkfollow: true
seçenekleri (sembol bağlantılardan sonra gelecek) vestrict: true
("olağan dışı" hatalara daha az toleranslı) ile gerçekleştirilecektir. Derleme yapılandırmanızdaglobFollow: false
ve/veyaglobStrict: false
ayarlarını yaparak ikisinden birini devre dışı bırakabilir ve önceki davranışa dönebilirsiniz. workbox-build
içindeki işlevlerin tümü, döndürdükleri yanıtlarda ek bir özellik (warnings
) döndürür. v2'de önemli hata olarak değerlendirilen bazı senaryolara artık izin verilmektedir, ancak bunlar bir dize dizisi olanwarnings
aracılığıyla bildirilmiştir.
v2'de generateSW
yöntemini şu şekilde çağırabilirsiniz:
const workboxBuild = require('workbox-build');
workboxBuild.generateSW({...})
.then(({count, size}) => console.log(`Precached ${count} files, totaling ${size} bytes.`))
.catch((error) => console.error(`Something went wrong: ${error}`));
Aynı kodu v3'te de kullanabilirsiniz, ancak warnings
olup olmadığını kontrol etmek ve bunları günlüğe kaydetmek iyi bir fikirdir:
const workboxBuild = require('workbox-build');
workboxBuild.generateSW({...})
.then(({count, size, warnings}) => {
for (const warning of warnings) {
console.warn(warning);
}
console.log(`Precached ${count} files, totalling ${size} bytes.`);
})
.catch((error) => console.error(`Something went wrong: ${error}`));
- v2'de kendi özel
ManifestTransform
işlevlerini yazan geliştiricilerin, manifest dizisini bir nesne içinde döndürmesi gerekir (yani,return manifestArray;
yerinereturn {manifest: manifestArray};
kullanmanız gerekir).mBu, eklentinizin isteğe bağlı birwarnings
özelliği eklemesine olanak tanır. Bu özellik, önemli olmayan uyarı bilgileri içeren bir dize dizisi olmalıdır.
v2'de özel bir ManifestTransform
yazdıysanız şuna benzer bir kod yazın:
const cdnTransform = manifestEntries => {
return manifestEntries.map(entry => {
const cdnOrigin = 'https://example.com';
if (entry.url.startsWith('/assets/')) {
entry.url = cdnOrigin + entry.url;
}
return entry;
});
};
v3 eşdeğeri şuna sahiptir:
const cdnTransform = manifestEntries => {
const manifest = manifestEntries.map(entry => {
const cdnOrigin = 'https://example.com';
if (entry.url.startsWith('/assets/')) {
entry.url = cdnOrigin + entry.url;
}
return entry;
});
return {manifest, warnings: []};
};
getFileManifestEntries()
işlevigetManifest()
olarak yeniden adlandırıldı ve döndürülen taahhüt artık önceden önbelleğe alınmış URL'ler hakkında ek bilgiler içeriyor.
Kod, v2'de aşağıdaki gibidir:
const manifestEntries = await workboxBuild.getFileManifestEntries({...});
aşağıdaki gibi yeniden yazılabilir:
const {manifestEntries, count, size, warnings} = await workboxBuild.getManifest({...});
// Use manifestEntries like before.
// Optionally, log the new info returned in count, size, warnings.
generateFileManifest()
işlevi kaldırıldı. Geliştiricilerin bunun yerinegetManifest()
öğesini çağırmaları ve verileri diske uygun biçimde yazmak için yanıtı kullanmaları önerilir.
workbox-cache-expiration
- Eklenti API'si değişmedi. Bu, çoğu geliştiricinin kullanacağı moddur. Bununla birlikte, API'yi bağımsız bir sınıf olarak kullanan geliştiricileri etkileyen önemli API değişiklikleri bulunmaktadır. Güncellenmiş API yüzeyi için belgeleri inceleyin.
workbox-cli
Geliştiriciler, desteklenen eksiksiz bir parametre grubu için KSA'yı --help
işaretiyle çalıştırabilir.
- İkili program komut dosyası için
workbox-cli
takma adı desteği kaldırıldı. İkili programa artık yalnızcaworkbox
olarak erişilebilir. generate:sw
veinject:manifest
v2 komutları, sürüm 3'tegenerateSW
veinjectManifest
olarak yeniden adlandırıldı.- v2'de, varsayılan yapılandırma dosyasının (açıkça belirtilmediğinde kullanılır) geçerli dizinde
workbox-cli-config.js
olduğu varsayılıyordu. v3'te bu değerworkbox-config.js
.
Bu durum, birlikte ele alındığında v2'de şu anlama gelir:
$ workbox inject:manifest
"inject manifest"i çalıştırır derleme işlemi (workbox-cli-config.js
kaynağından okunan bir yapılandırmayı kullanarak ve v3'te):
$ workbox injectManifest
aynı işlemi gerçekleştirir ancak workbox-config.js
üzerinden yapılandırmayı okur.
çalışma kutusu-önbelleğe alma
precache()
yöntemi daha önce hem önbellek değişikliklerini yapıyor hem de önbelleğe alınan girişleri sunmak için yönlendirmeyi oluşturuyordu. Artıkprecache()
yalnızca önbellek girişlerini değiştiriyor ve bu önbellekteki yanıtları sunmak için yeni bir yöntem olanaddRoute()
, bir rota kaydediyor. İkisi bir arada önceki işlevi kullanmak isteyen geliştiricilerprecacheAndRoute()
numaralı telefonu aramaya geçiş yapabilir.- Daha önce
WorkboxSW
oluşturucusu aracılığıyla yapılandırılan çeşitli seçenekler, artıkworkbox.precaching.precacheAndRoute([...], options)
öğesineoptions
parametresi olarak aktarılmaktadır. Bu seçenekler için varsayılan ayarlar (yapılandırılmadığında) referans dokümanlarda listelenmiştir. - Varsayılan olarak, dosya uzantısı olmayan URL'ler,
.html
uzantısı içeren bir önbellek girişiyle eşleşip eşleşmediğini otomatik olarak kontrol eder. Örneğin,/path/to/index
için bir istek yapılırsa (önceden önbelleğe alınmamış) ve/path/to/index.html
için önbelleğe alınmış bir giriş varsa bu önceden önbelleğe alınmış giriş kullanılır. Geliştiriciler, seçenekleriworkbox.precaching.precacheAndRoute()
içine iletirken{cleanUrls: false}
politikasını ayarlayarak bu yeni davranışı devre dışı bırakabilir. workbox-broadcast-update
, artık önceden önbelleğe alınmış öğelerin önbellek güncellemelerini duyurmak için otomatik olarak yapılandırılmayacak.
v2'de aşağıdaki kod:
const workboxSW = new self.WorkboxSW({
directoryIndex: 'index.html',
ignoreUrlParametersMatching: [/^utm_/],
precacheChannelName: 'precache-updates',
});
workboxSW.precache([...]);
v3 eşdeğeri şuna sahiptir:
workbox.precaching.addPlugins([
new workbox.broadcastUpdate.Plugin('precache-updates')
]);
workbox.precaching.precacheAndRoute([...], {
cleanUrls: false,
directoryIndex: 'index.html',
ignoreUrlParametersMatching: [/^utm_/],
});
çalışma kutusu yönlendirmesi
- Daha önce WorkboxSW nesnesinin
workbox.router.*
ad alanı aracılığıylaworkbox-routing
kullanan geliştiricilerin yeni ad alanına (workbox.routing.*
) geçmesi gerekiyor. - Rotalar artık ilk kaydedilen kazanma sırasına göre değerlendiriliyor. Bu, v2'de kullanılan
Route
değerlendirmesinin zıttı sıralamasıdır ve son kaydedilenRoute
değerine öncelik verilir. ExpressRoute
sınıfı ve "Ekspres-stil" desteği joker karakterler kaldırıldı. Bu,workbox-routing
boyutunu önemli ölçüde küçültür.workbox.routing.registerRoute()
parametresi için ilk parametre olarak kullanılan dizeler artık tam eşleme olarak değerlendirilecek. Joker karakter veya kısmi eşleşmeler,RegExp
tarafından işlenmelidir. İstek URL'sinin bir kısmı veya tamamı ile eşleşen tümRegExp
öğeleri rotayı tetikleyebilir.Router
sınıfınınaddFetchListener()
yardımcı yöntemi kaldırıldı. Geliştiriciler kendifetch
işleyicilerini açıkça ekleyebilir veyaworkbox.routing
tarafından sağlanan arayüzü kullanabilir. Bu durumda, dolaylı olarak birfetch
işleyicisi oluştururlar.registerRoutes()
veunregisterRoutes()
yöntemleri kaldırıldı. Tek birRoute
üzerinde çalışan bu yöntemlerin sürümleri değiştirilmedi. Aynı anda birden fazla rota kaydetmesi veya kaydını iptal etmesi gereken geliştiriciler bunun yerineregisterRoute()
veyaunregisterRoute()
üzerinde bir dizi çağrı yapmalıdır.
v2'de aşağıdaki kod:
const workboxSW = new self.WorkboxSW();
workboxSW.router.registerRoute(
'/path/with/.*/wildcard/',
workboxSW.strategies.staleWhileRevalidate()
);
workboxSW.router.registerRoute(
new RegExp('^https://example.com/'),
workboxSW.strategies.networkFirst()
);
v3 eşdeğeri şuna sahiptir:
workbox.routing.registerRoute(
new RegExp('^https://example.com/'),
workbox.strategies.networkFirst()
);
workbox.routing.registerRoute(
new RegExp('^/path/with/.*/wildcard'),
workbox.strategies.staleWhileRevalidate()
);
çalışma kutusu stratejileri (eski adıyla çalışma kutusu çalışma zamanı önbelleğe alma)
workbox-runtime-caching
modülü artık resmi olarakworkbox-strategies
adını aldı ve yeni adıylanpm
ürününde yayınlandı.- Bir stratejide önbellek adı sağlanmadan önbellek son geçerlilik tarihinin kullanılması artık geçerli değildir. 2. sürümde bu mümkündü:
workboxSW.strategies.staleWhileRevalidate({
cacheExpiration: {maxEntries: 50},
});
Bu durum, varsayılan önbellekte girişlerin süresinin dolmasına neden olur ve bu beklenmedik bir durumdur. v3'te önbellek adı gereklidir:
workboxSW.strategies.staleWhileRevalidate({
cacheName: 'my-cache',
plugins: [new workbox.expiration.Plugin({maxEntries: 50})],
});
cacheWillMatch
yaşam döngüsü yöntemicachedResponseWillBeUsed
olarak yeniden adlandırıldı.cacheWillMatch
uygulamasına tepki veren kendi eklentilerini yazmadıkları sürece geliştiriciler bu değişikliği göremezler.- Bir stratejiyi yapılandırırken eklentileri belirtmek için kullanılan söz dizimi değişti. Her eklentinin, strateji yapılandırmasının
plugins
özelliğinde açıkça listelenmesi gerekir.
v2'de aşağıdaki kod:
const workboxSW = new self.WorkboxSW();
const networkFirstStrategy = workboxSW.strategies.networkFirst({
cacheName: 'my-cache',
networkTimeoutSeconds: 5,
cacheExpiration: {
maxEntries: 50,
},
cacheableResponse: {
statuses: [0, 200],
},
});
v3 eşdeğeri şuna sahiptir:
const networkFirstStrategy = workbox.strategies.networkFirst({
cacheName: 'my-cache',
networkTimeoutSeconds: 5,
plugins: [
new workbox.expiration.Plugin({maxEntries: 50}),
new workbox.cacheableResponse.Plugin({statuses: [0, 200]}),
],
});
Daha fazla bilgi için "Eklentileri Kullanma" bölümüne bakın. rehberini inceleyin.
çalışma kutusu-sw
workbox-sw
, hafif bir "yükleyici" olarak yeniden yazıldı. yeni bir kodlayıcı içerir. Geliştiriciler,WorkboxSW
sınıfının yeni bir örneğini oluşturmak yerine, genel ad alanında otomatik olarak kullanıma sunulan mevcut bir örnekle etkileşim kurar.
Önceki sürüm 2.
importScripts('<path to workbox-sw>/importScripts/workbox-sw.prod.v2.1.3.js');
const workbox = new WorkboxSW({
skipWaiting: true,
clientsClaim: true,
// etc.
});
workbox.router.registerRoute(...);
v3'te workbox-sw.js
komut dosyasını içe aktarmanız yeterlidir. Kullanıma hazır bir örnek, genel ad alanında otomatik olarak workbox
biçiminde olur:
importScripts('<path to workbox-sw>/3.0.0/workbox-sw.js');
// workbox is implicitly created and ready for use.
workbox.routing.registerRoute(...);
skipWaiting
veclientsClaim
artıkWorkboxSW
oluşturucuya iletilen seçenek değil. Bunun yerine,workbox.clientsClaim()
veworkbox.skipWaiting()
yöntemleri olarak değiştirildi.- Daha önce v2 oluşturucuda desteklenen
handleFetch
seçeneği, v3'te artık desteklenmemektedir. Herhangi bir getirme işleyici çağrılmadan hizmet çalışanını test etmek için benzer bir işleve ihtiyaç duyan geliştiriciler, "Ağı atlama" özelliğini kullanabilirler. Bu seçenek, Chrome'un Geliştirici Araçları'nda mevcuttur.
workbox-webpack-plugin
Eklenti önemli ölçüde yeniden yazılmıştır ve çoğu durumda "sıfır yapılandırmada" kullanılabilir yatırım yapmanız önemlidir. Güncellenmiş API yüzeyi için belgeleri inceleyin.
- API artık
GenerateSW
veInjectManifest
olmak üzere iki sınıf sunuyor. Bu, modunswSrc
varlığına göre değiştiği v2 davranışı ile modlar arasındaki geçişin açık olmasını sağlar. - Varsayılan olarak, web paketi derleme ardışık düzenindeki öğeler önbellekte tutulur ve
globPatterns
özelliğinin yapılandırılması artık gerekmez.globPatterns
ürününü kullanmaya devam etmenizin tek nedeni, web paketi derlemenize dahil olmayan öğeleri önceden önbelleğe almanız gerekmesidir. Genel olarak, v3 eklentisine geçiş yaparkenglob
tabanlı önceki yapılandırmaların tümünü kaldırarak başlamalı ve bunları yalnızca özel olarak ihtiyacınız varsa yeniden eklemelisiniz.
Yardım alma
Çoğu taşıma işleminin basit olacağını tahmin ediyoruz. Bu kılavuzda ele alınmayan sorunlarla karşılaşırsanız GitHub'da bir sorun açarak bize bildirin.