با استفاده از Workbox-window

یکی از ماژول‌های 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 ارسال می کند.