یکی از ماژولهای Workbox که هنوز در این مستندات پوشش زیادی پیدا نکرده است workbox-window
است که مجموعهای از ماژولهایی است که در window
اجرا میشوند. اهداف این ماژول عبارتند از:
- برای سادهسازی ثبتنام و بهروزرسانیهای کارگر خدماتی با کمک به توسعهدهندگان برای شناسایی لحظات حیاتی چرخه عمر کارگر خدمات ، و پاسخگویی در آن لحظات را آسانتر میکند.
- برای جلوگیری از اشتباهات رایج توسعه دهندگان، مانند ثبت نام یک سرویس دهنده در محدوده اشتباه.
- برای ساده کردن پیام بین
window
و محدوده سرویس کارگر .
وارد کردن و استفاده از workbox-window
صادراتی که اغلب از workbox-window
استفاده می کنید کلاس Workbox
است که می توانید آن را در Node یا از CDN در یک صفحه وب وارد کنید.
ایجاد یک بسته محلی
اگر زنجیره ابزار شما دارای بستهای مانند بسته وب یا جمعآوری است، میتوانید workbox-window
به صورت محلی بستهبندی کنید.
ابتدا workbox-window
به عنوان وابستگی تولید برنامه خود نصب کنید:
npm install workbox-window --save
سپس، در جاوا اسکریپت برنامه خود، می توانید کلاس Workbox
را از workbox-window
import
:
<script type="module">
import {Workbox} from 'workbox-window';
if ('serviceWorker' in navigator) {
const wb = new Workbox('/sw.js');
wb.register();
}
</script>
اگرچه workbox-window
بسیار کوچک است، اما میتوانید آن را از منطق برنامه اصلی وبسایت خود با استفاده از import
پویا جدا کنید، که میتواند اندازه بسته اصلی صفحه شما را کاهش دهد:
<script type="module">
if ('serviceWorker' in navigator) {
const {Workbox} = await import('workbox-window');
const wb = new Workbox('/sw.js');
wb.register();
}
</script>
با استفاده از CDN
اگرچه روش توصیه شده نیست، اما یک راه ساده تر برای استفاده workbox-window
، وارد کردن آن از یک CDN است:
<script type="module">
import {Workbox} from 'https://storage.googleapis.com/workbox-cdn/releases/6.2.0/workbox-window.prod.mjs';
if ('serviceWorker' in navigator) {
const wb = new Workbox('/sw.js');
wb.register();
}
</script>
توجه داشته باشید که عنصر <script>
در مثال بالا از ویژگی type="module"
استفاده می کند. اگر میخواهید از دستورهای import
ثابت در مرورگر بدون مرحله ساخت استفاده کنید، این مورد ضروری است. همه مرورگرهای اصلی که از کارگران خدمات پشتیبانی میکنند، از ماژولهای جاوا اسکریپت نیز پشتیبانی میکنند، بنابراین خوب است که این کد را به هر مرورگری ارائه کنید، زیرا مرورگرهای قدیمیتر عناصر <script>
با مقدار مشخصه type
"module"
را نادیده میگیرند.
ثبت نام کارگر خدماتی
ثبت یک سرویس کارگر با workbox-window
با روش register
کلاس Workbox
انجام می شود:
import {Workbox} from 'workbox-window';
const wb = new Workbox('/sw.js');
wb.register();
ممکن است به نظر برسد که این همان ثبت نام یک کارگر خدماتی با استفاده از navigator.serviceWorker.register
است. با این حال، Workbox.register
قبل از ثبت سرویسکار از انتظار تا رویداد load
window
مراقبت میکند. این امر در شرایطی که پیش کش درگیر است، مطلوب است، بنابراین می توان از کشمکش پهنای باند که ممکن است راه اندازی صفحه را به تاخیر بیندازد، اجتناب کرد.
برقراری ارتباط بین window
و محدوده کارگر خدمات
کارکنان خدمات دامنه خود را جدا از window
دارند و فقط به زیر مجموعه ای از APIهای موجود در window
دسترسی دارند. با این حال، امکان برقراری ارتباط بین window
و سرویس دهنده وجود دارد. workbox-window
با روش messageSW
ماژول workbox-window
امکان ارتباط آسانتر بین دو حوزه را فراهم میکند.
Workbox از یک قالب خاص برای پیام ها استفاده می کند، یک شی با ویژگی های زیر است:
-
type
یک رشته منحصر به فرد مورد نیاز برای شناسایی پیام است. قالب باید با حروف بزرگ و زیرخط جداکننده کلمات باشد (به عنوان مثال،CACHE_URLS
). -
meta
یک رشته اختیاری است که نشان دهنده نام بسته Workbox ارسال کننده پیام است و معمولا حذف می شود. -
payload
یک پارامتر اختیاری است که نشان دهنده داده هایی است که می خواهید ارسال کنید. این می تواند هر نوع داده ای باشد.
در زیر نمونه ای از نحوه عملکرد messageSW
آورده شده است که با کد موجود در سرویس کار شما شروع می شود:
// sw.js
const SW_VERSION = '1.0.0';
self.addEventListener('message', (event) => {
if (event.data.type === 'GET_VERSION') {
event.ports[0].postMessage(SW_VERSION);
}
});
و سپس کد زیر را در صفحه وب خود قرار دهید:
const wb = new Workbox('/sw.js');
wb.register();
const swVersion = await wb.messageSW({type: 'GET_VERSION'});
console.log('Service Worker version:', swVersion);
موارد زیادی وجود دارد که در آن برقراری ارتباط بین یک سرویسکار و window
میتواند مفید باشد، مانند اطلاع دادن به کاربر هنگام در دسترس بودن بهروزرسانی کارگر . آن دستور العمل متکی به یک روش کمکی خاص برای self.skipWaiting
به نام messageSkipWaiting
است که پیامی با مقدار type
SKIP_WAITING
ارسال می کند.