این راهنما بر روی شکستن تغییرات ارائه شده در Workbox v3 متمرکز شده است، با نمونه هایی از تغییراتی که باید هنگام ارتقاء از تنظیمات Workbox v2 ایجاد کنید.
اگر در حال حاضر از ترکیب قدیمی sw-precache / sw-toolbox استفاده می کنید و برای اولین بار به دنبال انتقال به Workbox هستید، در اینجا یک راهنمای انتقال متفاوت وجود دارد که به شما کمک خواهد کرد.
v3 پس زمینه
نسخه نسخه 3 Workbox نشاندهنده بازسازی قابل توجهی از پایگاه کد موجود است. اهداف کلی عبارتند از:
- اندازه Workbox را به حداقل برسانید. مقدار کد زمان اجرا سرویس کارگری که دانلود و اجرا شده است کاهش یافته است. به جای انتخاب همه افراد در یک بسته یکپارچه، فقط کد برای ویژگیهای خاصی که استفاده میکنید در زمان اجرا وارد میشود.
- Workbox یک CDN دارد. ما میزبانی CDN مبتنی بر Google Cloud Storage را بهعنوان گزینهای متعارف برای دسترسی به کتابخانههای زمان اجرا Workbox ارائه میکنیم که راهاندازی و اجرای آن را با Workbox آسانتر میکند.
- اشکال زدایی و لاگ بهتر. تجربه اشکال زدایی و ورود به سیستم بسیار بهبود یافته است. هر زمان که Workbox از مبدا
localhostاستفاده می شود و همه گزارش ها و ادعاها از بیلدهای تولید حذف می شوند، گزارش های اشکال زدایی به طور پیش فرض فعال می شوند.
- پلاگین بسته وب بهبود یافته.
workbox-webpack-pluginنزدیکتر با فرآیند ساخت پک وب ادغام میشود و زمانی که میخواهید تمام داراییهای موجود در خط لوله ساخت را پیش کش کنید، امکان استفاده با پیکربندی صفر را فراهم میکند.
دستیابی به این اهداف، و پاکسازی برخی از جنبههای رابط کاربری قبلی که احساس ناخوشایندی میکردند یا منجر به ایجاد آنتیالگوها میشدند، نیاز به ایجاد تعدادی تغییرات اساسی در نسخه نسخه ۳ داشت.
شکستن تغییرات
پیکربندی ساخت
تغییرات زیر بر رفتار همه ابزارهای ساخت ما تأثیر می گذارد ( workbox-build ، workbox-cli ، workbox-webpack-plugin )، که مجموعه مشترکی از گزینه های پیکربندی را به اشتراک می گذارند.
- نام کنترلکننده
'fastest'قبلاً معتبر بود، و هنگام پیکربندیruntimeCaching، بهعنوان نام مستعار'staleWhileRevalidate'در نظر گرفته میشد. دیگر معتبر نیست و توسعهدهندگان باید مستقیماً از'staleWhileRevalidate'استفاده کنند. - چندین نام ویژگی
runtimeCaching.optionsبهروزرسانی شدهاند، و اعتبارسنجی پارامتر اضافی وجود دارد که در صورت استفاده از پیکربندی نامعتبر، باعث میشود یک ساخت با شکست مواجه شود. برای فهرستی از گزینه های پشتیبانی شده در حال حاضر به مستندات مربوط بهruntimeCachingمراجعه کنید.
جعبه کار-پس زمینه-همگام سازی
- پارامتر پیکربندی
maxRetentionTimeاکنون به جای چند میلی ثانیه به عنوان تعداد دقیقه تفسیر می شود. - اکنون یک رشته مورد نیاز وجود دارد که نشان دهنده نام صف است که باید به عنوان اولین پارامتر هنگام ساخت کلاس Plugin یا مستقل ارسال شود. (قبلاً به عنوان یکی از ویژگیهای گزینهها ارسال شده بود.) با اسناد سطح بهروزرسانیشده API مشورت کنید.
workbox-broadcast-cache-update
- اکنون یک رشته مورد نیاز وجود دارد که نشان دهنده نام کانال است که باید به عنوان اولین پارامتر هنگام ساخت کلاس Plugin یا مستقل ارسال شود.
به عنوان مثال، در v2 کلاس Plugin را به صورت زیر مقداردهی اولیه می کنید:
new workbox.broadcastCacheUpdate.BroadcastCacheUpdatePlugin({
channelName: 'cache-updates',
headersToCheck: ['etag'],
});
استفاده معادل در v3 این است:
new workbox.broadcastUpdate.Plugin('cache-updates', {headersToCheck: ['etag']});
با اسناد سطح API به روز شده مشورت کنید.
جعبه کار ساخت
- بهطور پیشفرض، تطبیق الگوی
globاکنون با گزینههایfollow: true(که به دنبال پیوندهای نمادین میآید) وstrict: true(که نسبت به خطاهای «غیر معمول» کمتر تحمل میکند). با تنظیمglobFollow: falseو/یاglobStrict: falseدر پیکربندی ساخت، میتوانید هر یک را غیرفعال کنید و به رفتار قبلی بازگردید. - توابع در
workbox-buildهمگی یک ویژگی اضافی،warnings، در پاسخ هایی که برمی گردانند، برمی گردانند. برخی از سناریوهایی که در نسخه 2 به عنوان خطاهای مهلک تلقی می شدند اکنون مجاز هستند، اما از طریقwarnings، که آرایه ای از رشته ها است، گزارش می شوند.
در نسخه 2، شما ممکن است generateSW فراخوانی کنید:
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}`));
در حالی که می توانید از همان کد در نسخه 3 استفاده کنید، بهتر است هر گونه warnings را بررسی کرده و آنها را ثبت کنید:
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}`));
- توسعه دهندگانی که توابع
ManifestTransformسفارشی خود را در نسخه 2 نوشته اند باید آرایهwarningsرا در یک شی برگردانند (یعنی به جایreturn manifestArray;باید ازreturn {manifest: manifestArray};استفاده کنید). باید آرایه ای از رشته ها حاوی اطلاعات هشدار غیر کشنده باشد.
اگر در نسخه 2 یک ManifestTransform سفارشی مینوشتید، کدی مانند:
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 از:
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()بهgetManifest()تغییر نام داده است، و وعده بازگشتی اکنون شامل اطلاعات اضافی در مورد URLهایی است که از پیش ذخیره شده اند.
کد مانند زیر در v2:
const manifestEntries = await workboxBuild.getFileManifestEntries({...});
را می توان در نسخه 3 به صورت زیر بازنویسی کرد:
const {manifestEntries, count, size, warnings} = await workboxBuild.getManifest({...});
// Use manifestEntries like before.
// Optionally, log the new info returned in count, size, warnings.
- تابع
generateFileManifest()حذف شده است. توسعه دهندگان تشویق می شوند به جای آن،getManifest()فراخوانی کنند و از پاسخ آن برای نوشتن داده ها روی دیسک در قالب مناسب استفاده کنند.
جعبه کار-کش-انقضا
- API افزونه ثابت مانده است، این حالتی است که اکثر توسعه دهندگان در نهایت از آن استفاده می کنند. با این حال تغییرات قابل توجهی در API وجود دارد که بر توسعه دهندگانی که از آن به عنوان یک کلاس مستقل استفاده می کنند تأثیر می گذارد. با اسناد سطح API به روز شده مشورت کنید.
workbox-cli
توسعه دهندگان می توانند CLI را با پرچم --help برای مجموعه کاملی از پارامترهای پشتیبانی شده اجرا کنند.
- پشتیبانی از نام مستعار
workbox-cliبرای اسکریپت باینری حذف شده است. باینری اکنون فقط به عنوانworkboxقابل دسترسی است. - دستورات v2
generate:swوinject:manifestبهgenerateSWوinjectManifestدر v3 تغییر نام داده اند. - در نسخه 2، فایل پیکربندی پیشفرض (مورد استفاده در زمانی که به صراحت ارائه نشده بود) به عنوان
workbox-cli-config.jsدر فهرست فعلی در نظر گرفته شد. در نسخه 3،workbox-config.jsاست.
در مجموع، این بدان معنی است که در v2:
$ workbox inject:manifest
فرآیند ساخت "inject manifest" را با استفاده از پیکربندی خوانده شده از workbox-cli-config.js و در نسخه 3 اجرا می کند:
$ workbox injectManifest
همین کار را انجام خواهد داد، اما پیکربندی را از workbox-config.js بخوانید.
جعبه کار-پیش کش
- متد
precache()قبلاً هم اصلاحات کش را انجام می داد و هم مسیریابی را برای سرویس دهی ورودی های کش تنظیم می کرد. اکنون،precache()فقط ورودیهای حافظه پنهان را تغییر میدهد، و یک روش جدید،addRoute()برای ثبت مسیری برای ارائه پاسخهای کش شده در معرض دید قرار گرفته است. توسعه دهندگانی که عملکرد قبلی و دو در یک را می خواهند می توانند به فراخوانیprecacheAndRoute()تغییر دهند. - چندین گزینه که قبلاً از طریق سازنده
WorkboxSWپیکربندی میشدند اکنون به عنوان پارامترoptionsدرworkbox.precaching.precacheAndRoute([...], options)ارسال میشوند. پیشفرضهای آن گزینهها، وقتی پیکربندی نشده باشند، در اسناد مرجع فهرست شدهاند. - به طور پیشفرض، URLهایی که فاقد هر گونه پسوند فایل هستند، بهطور خودکار برای مطابقت با ورودی حافظه پنهان حاوی پسوند
.htmlبررسی میشوند. به عنوان مثال، اگر درخواستی برای/path/to/index(که از پیش ذخیره نشده است) انجام شود و یک ورودی از پیش کش برای/path/to/index.htmlوجود داشته باشد، آن ورودی از پیش ذخیره شده استفاده خواهد شد. توسعهدهندگان میتوانند این رفتار جدید را با تنظیم{cleanUrls: false}هنگام انتقال گزینهها بهworkbox.precaching.precacheAndRoute()غیرفعال کنند. -
workbox-broadcast-updateدیگر به طور خودکار برای اعلام بهروزرسانیهای حافظه پنهان برای داراییهای از پیش ذخیرهشده پیکربندی نمیشود.
کد زیر در v2:
const workboxSW = new self.WorkboxSW({
directoryIndex: 'index.html',
ignoreUrlParametersMatching: [/^utm_/],
precacheChannelName: 'precache-updates',
});
workboxSW.precache([...]);
دارای معادل v3 از:
workbox.precaching.addPlugins([
new workbox.broadcastUpdate.Plugin('precache-updates')
]);
workbox.precaching.precacheAndRoute([...], {
cleanUrls: false,
directoryIndex: 'index.html',
ignoreUrlParametersMatching: [/^utm_/],
});
مسیریابی جعبه کار
- برنامهنویسانی که قبلاً از
workbox-routingاز طریق فضای نامworkbox.router.*یک WorkboxSW استفاده میکردند، باید به فضای نام جدید،workbox.routing.*تغییر مکان دهند. - مسیرها اکنون به ترتیب اولین ثبت نام-برنده ارزیابی می شوند. این ترتیب مخالف ارزیابی
Routeاست که در v2 استفاده شد، جایی که آخرینRouteثبتشده در اولویت قرار میگیرد. - کلاس
ExpressRouteو پشتیبانی از حروف عام "سبک اکسپرس" حذف شده است . این امر اندازهworkbox-routingبه میزان قابل توجهی کاهش می دهد. رشتههایی که بهعنوان اولین پارامتر برایworkbox.routing.registerRoute()استفاده میشوند، اکنون بهعنوان منطبق دقیق تلقی میشوند. منطبقهای عام یا جزئی باید توسطRegExpمدیریت شوند—استفاده از هرRegExpکه با بخشی یا تمام URL درخواست مطابقت دارد میتواند یک مسیر را راهاندازی کند. - متد کمکی
addFetchListener()از کلاسRouterحذف شده است. توسعه دهندگان می توانند به طور صریحfetchخود را اضافه کنند یا از رابط ارائه شده توسطworkbox.routingاستفاده کنند که به طور ضمنی یک کنترل کنندهfetchبرای آنها ایجاد می کند. - متدهای
registerRoutes()وunregisterRoutes()حذف شدند. نسخههای آن روشهایی که در یکRouteکار میکنند تغییری نکردهاند، و توسعهدهندگانی که نیاز دارند چندین مسیر را بهطور همزمان ثبت یا لغو ثبت کنند، باید بهجای آن، یک سری تماس باregisterRoute()یاunregisterRoute()برقرار کنند.
کد زیر در v2:
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 از:
workbox.routing.registerRoute(
new RegExp('^https://example.com/'),
workbox.strategies.networkFirst()
);
workbox.routing.registerRoute(
new RegExp('^/path/with/.*/wildcard'),
workbox.strategies.staleWhileRevalidate()
);
workbox-strategies (که قبلا به عنوان workbox-runtime-caching شناخته می شد)
- ماژول
workbox-runtime-cachingاکنون رسما به عنوانworkbox-strategiesشناخته می شود و با نام جدید خود درnpmمنتشر شده است. - استفاده از انقضای کش در یک استراتژی بدون ارائه نام کش دیگر معتبر نیست. در نسخه 2 این امکان وجود داشت:
workboxSW.strategies.staleWhileRevalidate({
cacheExpiration: {maxEntries: 50},
});
این منجر به منقضی شدن ورودیها در حافظه پنهان پیشفرض میشود که غیرمنتظره است. در نسخه 3، یک نام کش مورد نیاز است:
workboxSW.strategies.staleWhileRevalidate({
cacheName: 'my-cache',
plugins: [new workbox.expiration.Plugin({maxEntries: 50})],
});
- روش چرخه حیات
cacheWillMatchبهcachedResponseWillBeUsedتغییر نام داده است. این نباید یک تغییر قابل مشاهده برای توسعه دهندگان باشد مگر اینکه افزونه های خود را بنویسند که بهcacheWillMatchواکنش نشان می دهد. - نحو تعیین پلاگین ها هنگام پیکربندی استراتژی تغییر کرده است. هر افزونه باید به صراحت در ویژگی
pluginsپیکربندی استراتژی فهرست شود.
کد زیر در v2:
const workboxSW = new self.WorkboxSW();
const networkFirstStrategy = workboxSW.strategies.networkFirst({
cacheName: 'my-cache',
networkTimeoutSeconds: 5,
cacheExpiration: {
maxEntries: 50,
},
cacheableResponse: {
statuses: [0, 200],
},
});
دارای معادل v3 از:
const networkFirstStrategy = workbox.strategies.networkFirst({
cacheName: 'my-cache',
networkTimeoutSeconds: 5,
plugins: [
new workbox.expiration.Plugin({maxEntries: 50}),
new workbox.cacheableResponse.Plugin({statuses: [0, 200]}),
],
});
در راهنمای " استفاده از افزونه ها " می توانید اطلاعات بیشتری کسب کنید.
جعبه کار-sw
- در زیر هود،
workbox-swبازنویسی شده است تا یک رابط سبک وزن "لودر" باشد، که برخی از پیکربندیهای اولیه را میگیرد و مسئول کشیدن سایر ماژولهایی است که در زمان اجرا مورد نیاز هستند. بهجای ساختن نمونهای جدید از کلاسWorkboxSW، توسعهدهندگان با یک نمونه موجود که بهطور خودکار در فضای نام جهانی نمایش داده میشود، تعامل خواهند داشت.
قبلا در نسخه 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(...);
در نسخه 3، شما فقط باید اسکریپت workbox-sw.js وارد کنید، و یک نمونه آماده به طور خودکار در فضای نام جهانی به عنوان workbox در دسترس خواهد بود:
importScripts('<path to workbox-sw>/3.0.0/workbox-sw.js');
// workbox is implicitly created and ready for use.
workbox.routing.registerRoute(...);
skipWaitingوclientsClaimدیگر گزینههایی نیستند که به سازندهWorkboxSWمنتقل شوند. در عوض، آنها به متدهایworkbox.clientsClaim()وworkbox.skipWaiting()تغییر یافتهاند.- گزینه
handleFetchکه قبلاً در سازنده v2 پشتیبانی می شد دیگر در نسخه 3 پشتیبانی نمی شود. توسعهدهندگانی که برای آزمایش کارگر خدمات خود بدون فراخوانی واکشی نیاز به عملکرد مشابه دارند، میتوانند از گزینه « Bypass for network » موجود در ابزار توسعهدهنده Chrome استفاده کنند.

workbox-webpack-plugin
این افزونه بطور قابل ملاحظه ای بازنویسی شده است و در بسیاری از موارد می توان از آن در حالت "صفر پیکربندی" استفاده کرد. با اسناد مربوط به سطح API به روز شده مشورت کنید.
- API اکنون دو کلاس
GenerateSWوInjectManifestرا در معرض نمایش قرار می دهد. این تغییر حالتها را در مقابل رفتار v2 که در آن رفتار براساس وجودswSrcتغییر میکند، واضح میسازد. - بهطور پیشفرض، داراییهای موجود در خط لوله کامپایل پک وب از پیش ذخیره میشوند و دیگر نیازی به پیکربندی
globPatternsنیست. تنها دلیل برای ادامه استفاده ازglobPatternsاین است که نیاز به پیش کش کردن دارایی هایی دارید که در ساخت بسته وب شما گنجانده نشده اند. به طور کلی، هنگام مهاجرت به پلاگین v3، باید با حذف تمام تنظیمات مبتنی برglobقبلی خود شروع کنید و فقط در صورت نیاز دوباره آن را اضافه کنید.
کمک گرفتن
ما پیشبینی میکنیم که بیشتر مهاجرتها ساده باشد. اگر با مشکلاتی مواجه شدید که در این راهنما پوشش داده نشده است، با باز کردن مشکلی در GitHub به ما اطلاع دهید.