پیش کش با Workbox

پیش کش کردن یکی از رایج ترین کارهایی است که شما در یک سرویس دهنده انجام می دهید، و Workbox انعطاف پذیری زیادی را در نحوه انجام این وظیفه مهم، صرف نظر از اینکه کدام یک از ابزارهای ساخت Workbox را انتخاب می کنید، ارائه می دهد. در این راهنما، نحوه پیش کش کردن دارایی ها با استفاده از generateSW و injectManifest و همچنین اینکه کدام یک از این روش ها ممکن است برای پروژه شما مناسب باشد را خواهید آموخت.

پیش کش با generateSW

generateSW ساده ترین راه برای پیش کش کردن دارایی ها در Workbox است. نکته مهمی که باید در مورد generateSW به خاطر بسپارید این است که شما سرویس کارگر خود را نمی‌نویسید، بلکه از Workbox می‌خواهید که یکی برای شما ایجاد کند. با این حال، می‌توانید از طریق گزینه‌های پیکربندی مختلف بر رفتار آن تأثیر بگذارید.

generateSW به طور پیش فرض بسته به ابزار ساختی که استفاده می کنید، کارهای مختلفی انجام می دهد. هنگام استفاده از workbox-webpack-plugin ، لازم نیست هیچ گزینه پیکربندی را مشخص کنید. به‌طور پیش‌فرض، افزونه همه چیزهایی را که پک وب در نمودار وابستگی خود گنجانده است، پیش کش می‌کند و یک سرویس‌کار به نام service-worker.js در فهرستی که توسط output.path مشخص شده است، می‌نویسد.

از سوی دیگر، اگر از workbox-build یا workbox-cli استفاده می‌کنید، فقط دارایی‌های HTML، CSS و جاوا اسکریپت که از سیستم فایل محلی خوانده می‌شوند به‌طور پیش‌فرض از پیش ذخیره می‌شوند. از لحاظ پیکربندی، باید swDest و گزینه globDirectory را در پیکربندی generateSW برای پیش کش کردن مشخص کنید. به احتمال زیاد، می‌خواهید گزینه‌های دیگری را نیز پیکربندی کنید که بر رفتار کارکنان خدماتی شما تأثیر می‌گذارد، بنابراین نگاهی به مستندات بیندازید.

پیش کش با injectManifest

استفاده از injectManifest به آسانی استفاده از generateSW نیست، اما برای انعطاف‌پذیری بیشتر، سهولت استفاده را عوض می‌کنید. در جایی که generateSW کل نسل سرویس‌کار را برای شما مدیریت می‌کند، injectManifest یک سرویس‌کار را که شما می‌نویسید را به عنوان منبع خود می‌گیرد و فهرستی از URLها را برای پیش کش تزریق می‌کند، در حالی که بقیه سرویس‌کار شما را همانطور که هست رها می‌کند.

هنگامی که injectManifest استفاده می کنید، شما مسئول سیم کشی منطق پیش کش هستید. هنگامی که injectManifest کارمند سرویس ورودی شما را بررسی می کند، به دنبال یک متغیر self.__WB_MANIFEST و آن را با مانیفست پیش کش جایگزین می کند. اگر این متغیر وجود نداشته باشد، injectManifest یک خطا ایجاد می کند.

فهرست ورودی‌های مانیفست پیش کش را می‌توان با گزینه‌های پیکربندی اضافی بهینه‌سازی کرد.

مقایسه کنار هم

برای مقایسه میزان استفاده از متدهای generateSW و injectManifest روی هر یک از تب های زیر کلیک کنید:

از آنجایی که generateSW یک سرویس‌کار تولید می‌کند، شما فقط باید یک پیکربندی را مشخص کنید. در زیر مثالی با استفاده از workbox-build آورده شده است:

// build-sw.js
import {generateSW} from 'workbox-build';

generateSW({
  swDest: './dist/sw.js',
  globDirectory: './dist',
  globPatterns: [
    '**/*.js',
    '**/*.css',
    '**/*.svg'
  ]
});

سپس Service Worker را می توان در خط فرمان با Node ساخت:

node build-sw.js

از آنجایی که injectManifest به یک منبع سرویس کار نیاز دارد، یک مثال حداقل قابل دوام به یک فایل سرویس کار منبع نیاز دارد. اگر تنها چیزی که نیاز است پیش کش است، این کارمند سرویس ورودی ممکن است چیزی شبیه به این باشد:

import {precacheAndRoute} from 'workbox-precaching';

precacheAndRoute(self.__WB_MANIFEST);

به رشته self.__WB_MANIFEST توجه کنید. این یک مکان نگهدار است که Workbox آن را با مانیفست پیش کش جایگزین می کند. در زیر یک پیکربندی معتبر برای این مورد استفاده وجود دارد:

// build-sw.js
import {injectManifest} from 'workbox-build';

injectManifest({
  swSrc: './src/sw.js',
  swDest: './dist/sw.js',
  globDirectory: './dist',
  globPatterns: [
    '**/*.js',
    '**/*.css',
    '**/*.svg'
  ]
});

اگر نیازمندی‌های پیچیده‌ای مانند مسیریابی پیشرفته، استراتژی‌های ذخیره سفارشی ذخیره‌سازی سفارشی، یا موارد دیگری که توسط گزینه‌های injectManifest پوشش داده نمی‌شوند، ترجیح generateSW می‌شود.

نتیجه

پیش کش در Workbox بسیار ساده تر از زمانی است که شما مجبور باشید پیش کش را به تنهایی مدیریت کنید، به خصوص در مواردی که دارایی های نسخه بندی شده کامپایل شده توسط باندلرها مربوط می شود. با این حال، پیش کش کردن تنها کاری نیست که احتمالاً در یک کارگر خدماتی انجام خواهید داد. همانطور که ادامه می دهید، تکنیک های دیگری مانند کش در زمان اجرا را یاد خواهید گرفت.