مزایا و معایب استفاده از منطق انقضای یکسان یا متفاوت در لایههای حافظه پنهان سرویسکار و حافظه پنهان HTTP.
درحالیکه کارگران خدمات و برنامههای وب پیشرو درحال تبدیل شدن به استانداردهای برنامههای وب مدرن هستند، ذخیرهسازی منابع در حافظه نهان پیچیدهتر از همیشه شده است. این مقاله تصویر کلی از ذخیرهسازی موقت مرورگر را پوشش میدهد، ازجمله:
- موارد استفاده و تفاوتهای بین ذخیره مؤقت کارگر سرویس و ذخیره مؤقت HTTP.
- The pros and cons of different service worker caching expiry strategies compared to regular HTTP caching strategies.
نمای کلی جریان ذخیرهسازی در حافظه نهان
در سطح بالا، مرورگر هنگام درخواست منبع، ترتیب ذخیره مؤقت زیر را دنبال میکند:
- حافظه پنهان کارگر سرویس: کارگر سرویس بررسی میکند که آیا منبع در حافظه پنهان آن وجود دارد یا نه و براساس استراتژیهای ذخیرهسازی برنامهریزیشده خود تصمیم میگیرد که آیا منبع را برگرداند یا نه. توجه داشته باشید که این اتفاق بهطور خودکار نمیافتد. باید یک کنترلکننده رویداد واکشی در کارگر سرویس خود ایجاد کنید و درخواستهای شبکه را رهگیری کنید تا درخواستها از حافظه پنهان کارگر سرویس بهجای شبکه ارائه شوند.
- حافظه نهان HTTP (که بهعنوان حافظه نهان مرورگر نیز شناخته میشود): اگر منبع در حافظه نهان HTTP پیدا شود و هنوز منقضی نشده باشد، مرورگر بهطور خودکار از منبع موجود در حافظه نهان HTTP استفاده میکند.
- سمت سرور: اگر چیزی در حافظه نهان عامل خدماتی یا حافظه نهان HTTP پیدا نشود، مرورگر برای درخواست منبع به شبکه میرود. اگر منبع در CDN ذخیره نشده باشد، درخواست باید به سرور مبدأ برگردد.

لایههای ذخیره در حافظه نهان
ذخیره در حافظه نهان عامل خدماتی
یک کارگر سرویس درخواستهای اچتیتیپی نوع شبکه را رهگیری میکند و از یک استراتژی ذخیرهسازی استفاده میکند تا تعیین کند چه منابعی باید به مرورگر بازگردانده شوند. حافظه نهان کارگر سرویس و حافظه نهان HTTP هدف کلی یکسانی را دنبال میکنند، اما حافظه نهان کارگر سرویس قابلیتهای ذخیرهسازی بیشتری ارائه میدهد، مانند کنترل دقیق بر روی آنچه دقیقاً ذخیره میشود و نحوه انجام ذخیرهسازی.
کنترل حافظه نهان کارگر سرویس
یک کارگر سرویس درخواستهای HTTP را با شنوندگان رویداد (معمولاً رویداد fetch) رهگیری میکند. این
تکهکد منطق
استراتژی ذخیرهسازی در حافظه نهان Cache-First را نشان میدهد.

بهشدت توصیه میشود از Workbox استفاده کنید تا از دوبارهکاری جلوگیری شود. برای مثال، میتوانید مسیرهای نشانی وب منبع را با یک خط کد عبارت باقاعده ثبت کنید.
import {registerRoute} from 'workbox-routing';
registerRoute(new RegExp('styles/.*\\.css'), callbackHandler);
موارد استفاده و راهبردهای ذخیرهسازی در حافظه پنهان برای Service Worker
جدول بعدی راهبردهای رایج ذخیره مؤقت در حافظه نهان کارگر سرویس و زمان مفید بودن هر راهبرد را نشان میدهد.
| استراتژیها | دلیل تازگی | موارد استفاده |
|---|---|---|
| فقط شبکه | محتوا باید همیشه بهروز باشد. |
|
| شبکه درحال بازگشت به حافظه نهان است | بهتر است محتوای تازه ارائه شود. بااینحال، اگر شبکه قطع شود یا ناپایدار باشد، ارائه محتوای کمی قدیمی قابلقبول است. |
|
| Stale-while-revalidate | ارائه فوری محتوای ذخیرهشده در حافظه نهان مشکلی ندارد، اما در آینده باید از محتوای بهروزشده ذخیرهشده در حافظه نهان استفاده شود. |
|
| ابتدا حافظه پنهان، سپس شبکه | محتوا غیربحرانی است و میتواند از حافظه پنهان برای بهبود عملکرد ارائه شود، اما service worker باید گاهی اوقات بهروزرسانیها را بررسی کند. |
|
| فقط حافظه پنهان | محتوا بهندرت تغییر میکند. |
|
مزایای اضافی ذخیرهسازی موقت کارگر سرویس
علاوهبر کنترل دقیق منطق ذخیرهسازی در حافظه نهان، ذخیرهسازی در حافظه نهان کارگر سرویس این موارد را نیز ارائه میدهد:
- حافظه و فضای ذخیرهسازی بیشتر برای مبدأ شما: مرورگر منابع حافظه نهان HTTP را براساس هر مبدأ اختصاص میدهد. به عبارت دیگر، اگر چند زیردامنه داشته باشید، همه آنها از حافظه پنهان HTTP یکسانی استفاده میکنند. هیچ تضمینی وجود ندارد که محتوای مبدأ/دامنه شما برای مدت طولانی در حافظه پنهان HTTP باقی بماند. برای مثال، کاربر ممکن است با پاکسازی دستی ازطریق میانای تنظیمات مرورگر یا راهاندازی بارگیری مجدد سخت در صفحه، حافظه پنهان را پاک کند. با حافظه نهان کارگر سرویس، احتمال بسیار بیشتری وجود دارد که محتوای ذخیرهشده در حافظه نهان شما در حافظه نهان باقی بماند. برای اطلاعات بیشتر، فضای ذخیرهسازی پایدار را ببینید.
- انعطافپذیری بیشتر با شبکههای ناپایدار یا تجربههای آفلاین: با حافظه پنهان HTTP، فقط یک انتخاب دودویی دارید: یا منبع در حافظه پنهان ذخیره میشود یا نمیشود. با ذخیرهسازی موقت کارگر سرویس میتوانید «مشکلات» کوچک را بسیار آسانتر کاهش دهید (با استراتژی «stale-while-revalidate»)، یک تجربه آفلاین کامل (با استراتژی «فقط حافظه پنهان») یا حتی چیزی در این بین ارائه دهید، مانند رابطهای کاربری سفارشیشده با بخشهایی از صفحه که از حافظه پنهان کارگر سرویس میآیند و برخی بخشها مستثنی شدهاند (با استراتژی «Set catch handler») درصورت لزوم.
ذخیرهسازی HTTP در حافظه نهان
اولین باری که مرورگر صفحه وب و منابع مرتبط را بار میکند، این منابع را در حافظه نهان HTTP خود ذخیره میکند. حافظه پنهان HTTP معمولاً بهطور خودکار توسط مرورگرها فعال میشود، مگراینکه کاربر نهایی آن را صریحاً غیرفعال کرده باشد.
استفاده از حافظه پنهان HTTP بهمعنای تکیه بر سرور برای تعیین زمان ذخیره منبع در حافظه پنهان و مدت زمان آن است.
کنترل انقضای حافظه نهان HTTP با سرصفحههای پاسخ HTTP
وقتی سرور به درخواست مرورگر برای منبعی پاسخ میدهد، سرور از سرایندهای پاسخ HTTP استفاده میکند تا به مرورگر بگوید چه مدت باید منبع را در حافظه نهان ذخیره کند. برای کسب اطلاعات بیشتر، به سرایندهای پاسخ: پیکربندی سرور وب مراجعه کنید.
موارد استفاده و راهبردهای ذخیرهسازی موقت HTTP
ذخیرهسازی HTTP بسیار سادهتر از ذخیرهسازی عامل خدماتی است، زیرا ذخیرهسازی HTTP فقط با منطق انقضای منبع مبتنی بر زمان (TTL) سروکار دارد. برای آشنایی بیشتر با استراتژیهای ذخیرهسازی HTTP، به از کدام مقادیر سرایند پاسخ باید استفاده کنید؟ و جلوگیری از درخواستهای غیرضروری شبکه با حافظه پنهان HTTP (خلاصه) مراجعه کنید.
طراحی منطق انقضای حافظه نهان
این بخش مزایا و معایب استفاده از منطق انقضای یکسان در لایههای حافظه پنهان سرویسکار و حافظه پنهان HTTP، و همچنین مزایا و معایب منطق انقضای جداگانه در این لایهها را توضیح میدهد.
منطق انقضای سازگار برای همه لایههای حافظه نهان
برای نشان دادن مزایا و معایب، ۳ سناریو را بررسی میکنیم: بلندمدت، میانمدت، و کوتاهمدت.
| وضعیتها | ذخیره در حافظه نهان بلندمدت | ذخیره در حافظه نهان میانمدت | ذخیره در حافظه نهان کوتاهمدت |
|---|---|---|---|
| استراتژی ذخیرهسازی موقت عامل خدماتی | حافظه نهان، بازگشت به شبکه | Stale-while-revalidate | شبکه درحال بازگشت به حافظه پنهان است |
| طول عمر حافظه نهان عامل خدماتی | ۳۰ روز | ۱ روز | ۱۰ دقیقه |
| حداکثر سن حافظه نهان HTTP | ۳۰ روز | ۱ روز | ۱۰ دقیقه |
سناریو: ذخیرهسازی بلندمدت در حافظه نهان (حافظه نهان، بازگشت به شبکه)
- وقتی منبع ذخیرهشده در حافظه نهان معتبر باشد (کمتر از ۳۰ روز): کارگر سرویس منبع ذخیرهشده در حافظه نهان را بلافاصله بدون رفتن به شبکه برمیگرداند.
- وقتی منبع ذخیرهشده در حافظه نهان منقضی میشود (> ۳۰ روز): سرویسکار برای واکشی منبع به شبکه میرود. مرورگر نسخهای از منبع را در حافظه پنهان HTTP خود ندارد، بنابراین برای دریافت منبع به سمت سرور میرود.
نکته منفی: در این سناریو، ذخیره کردن در حافظه نهان HTTP ارزش کمتری دارد زیرا مرورگر همیشه درخواست را به سمت سرور ارسال میکند وقتی حافظه نهان در عامل خدماتی منقضی میشود.
سناریو: ذخیرهسازی میانمدت در حافظه نهان (stale-while-revalidate)
- وقتی منبع ذخیرهشده در حافظه نهان معتبر باشد (کمتر از ۱ روز): سرویسکار منبع ذخیرهشده در حافظه نهان را فوراً برمیگرداند و برای واکشی منبع به شبکه میرود. مرورگر نسخهای از منبع را در حافظه نهان HTTP خود دارد، بنابراین آن نسخه را به عامل خدماتی برمیگرداند.
- وقتی منبع ذخیرهشده در حافظه نهان منقضی شده باشد (بیشاز ۱ روز): سرویسکار منبع ذخیرهشده در حافظه نهان را فوراً برمیگرداند و برای واکشی منبع به شبکه میرود. مرورگر نسخهای از منبع را در حافظه نهان HTTP خود ندارد، بنابراین برای واکشی منبع به سمت سرور میرود.
نکته منفی: عامل خدماتی برای لغو حافظه نهان HTTP به پاکسازی حافظه نهان اضافی نیاز دارد تا بتواند بیشترین بهره را از مرحله «اعتبارسنجی مجدد» ببرد.
سناریو: ذخیرهسازی موقت کوتاهمدت (شبکه به حافظه پنهان برمیگردد)
- وقتی منبع ذخیرهشده در حافظه نهان معتبر است (کمتر از ۱۰ دقیقه): سرویسورکر برای واکشی منبع به شبکه میرود. مرورگر نسخهای از منبع را در حافظه نهان HTTP خود دارد، بنابراین آن را بدون رفتن به سمت سرور به عامل خدماتی برمیگرداند.
- وقتی منبع ذخیرهشده در حافظه نهان منقضی میشود (بیشاز ۱۰ دقیقه): سرویسکار فوراً منبع ذخیرهشده در حافظه نهان را برمیگرداند و برای واکشی منبع به شبکه میرود. مرورگر نسخهای از منبع را در حافظه نهان HTTP خود ندارد، بنابراین برای واکشی منبع به سمت سرور میرود.
نکته منفی: مشابه سناریوی ذخیرهسازی موقت میانمدت، سرویسکار به منطق اضافی برای شکستن حافظه پنهان نیاز دارد تا حافظه پنهان HTTP را لغو کند و آخرین منبع را از سمت سرور واکشی کند.
کارگر خدماتی در همه سناریوها
در همه سناریوها، حافظه نهان عامل خدماتی همچنان میتواند منابع ذخیرهشده در حافظه نهان را درصورت ناپایدار بودن شبکه برگرداند. ازسوی دیگر، وقتی شبکه ناپایدار یا قطع باشد، حافظه پنهان HTTP قابلاطمینان نیست.
منطق انقضای حافظه نهان متفاوت در حافظه نهان عامل خدماتی و لایههای HTTP
برای نشان دادن مزایا و معایب، دوباره به سناریوهای بلندمدت، میانمدت، و کوتاهمدت نگاه خواهیم کرد.
| وضعیتها | ذخیره در حافظه نهان بلندمدت | ذخیره در حافظه نهان میانمدت | ذخیره در حافظه نهان کوتاهمدت |
|---|---|---|---|
| استراتژی ذخیرهسازی موقت عامل خدماتی | حافظه نهان، بازگشت به شبکه | Stale-while-revalidate | شبکه درحال بازگشت به حافظه پنهان است |
| طول عمر حافظه نهان عامل خدماتی | ۹۰ روز | ۳۰ روز | ۱ روز |
| حداکثر سن حافظه نهان HTTP | ۳۰ روز | ۱ روز | ۱۰ دقیقه |
سناریو: ذخیرهسازی بلندمدت در حافظه نهان (حافظه نهان، بازگشت به شبکه)
- وقتی منبع ذخیرهشده در حافظه نهان در حافظه نهان عامل خدماتی معتبر باشد (کمتر از ۹۰ روز): عامل خدماتی منبع ذخیرهشده در حافظه نهان را فوراً برمیگرداند.
- وقتی منبع ذخیرهشده در حافظه نهان در حافظه نهان کارگر سرویس منقضی میشود (> ۹۰ روز): کارگر سرویس برای واکشی منبع به شبکه میرود. مرورگر نسخهای از منبع را در حافظه نهان HTTP خود ندارد، بنابراین به سمت سرور میرود.
مزایا و معایب:
- مزیت: کاربران پاسخ فوری دریافت میکنند زیرا کارگر سرویس منابع ذخینهشده در حافظه نهان را فوراً برمیگرداند.
- مزیت: کارگر سرویس کنترل دقیقتری بر زمان استفاده از حافظه پنهان خود و زمان درخواست نسخههای جدید منابع دارد.
- نکته منفی: استراتژی ذخیرهسازی موقت کارگر سرویس با تعریف دقیق لازم است.
سناریو: ذخیره موقت میانمدت (stale-while-revalidate)
- وقتی منبع ذخیرهشده در حافظه نهان عامل خدماتی معتبر باشد (کمتر از ۳۰ روز): عامل خدماتی فوراً منبع ذخیرهشده در حافظه نهان را برمیگرداند.
- وقتی منبع ذخیرهشده در حافظه پنهان در حافظه پنهان کارگر سرویس منقضی میشود (> ۳۰ روز): کارگر سرویس برای منبع به شبکه میرود. مرورگر نسخهای از منبع را در حافظه نهان HTTP خود ندارد، بنابراین به سمت سرور میرود.
مزایا و معایب:
- مزیت: کاربران پاسخ فوری دریافت میکنند زیرا کارگر سرویس منابع ذخیرهشده در حافظه نهان را فوراً برمیگرداند.
- مزیت: بهلطف اعتبارسنجی مجددی که «در پسزمینه» اتفاق میافتد، سرویسکار میتواند اطمینان حاصل کند که درخواست بعدی برای نشانی وب دادهشده از پاسخ جدیدی از شبکه استفاده میکند.
- نکته منفی: استراتژی ذخیرهسازی موقت کارگر سرویس با تعریف دقیق لازم است.
سناریو: ذخیرهسازی موقت کوتاهمدت (شبکه به حافظه پنهان برمیگردد)
- وقتی منبع ذخیرهشده در حافظه پنهان در حافظه پنهان سرویسکار معتبر است (کمتر از ۱ روز): سرویسکار برای منبع به شبکه میرود. مرورگر منبع را از حافظه نهان HTTP برمیگرداند (اگر در آنجا باشد). اگر شبکه قطع باشد، عامل خدماتی منبع را از حافظه نهان عامل خدماتی برمیگرداند
- وقتی منبع ذخیرهشده در حافظه پنهان در حافظه پنهان کارمند سرویس منقضی میشود (> ۱ روز): کارمند سرویس برای واکشی منبع به شبکه میرود. مرورگر منابع را ازطریق شبکه واکشی میکند زیرا نسخه ذخیرهشده در حافظه نهان HTTP آن منقضی شده است.
مزایا و معایب:
- مزیت: وقتی شبکه ناپایدار یا قطع است، کارگر سرویس منابع ذخیرهشده در حافظه نهان را فوراً برمیگرداند.
- نکته منفی: عامل خدماتی برای لغو حافظه نهان HTTP و ایجاد درخواستهای «ابتدا شبکه» به حافظه نهانشکن اضافی نیاز دارد.
نتیجهگیری
باتوجهبه پیچیدگی ترکیب سناریوهای ذخیرهسازی در حافظه نهان، نمیتوان یک قانون طراحی کرد که همه موارد را پوشش دهد. بااینحال، براساس یافتههای بخشهای قبلی، چند پیشنهاد وجود دارد که باید هنگام طراحی راهبردهای حافظه نهان خود به آنها توجه کنید:
- منطق ذخیرهسازی موقت عامل خدماتی لازم نیست با منطق انقضای ذخیرهسازی موقت HTTP سازگار باشد. درصورت امکان، از منطق انقضای طولانیتر در کارگر سرویس استفاده کنید تا به کارگر سرویس کنترل بیشتری بدهید.
- ذخیره موقت HTTP هنوز نقش مهمی دارد، اما وقتی شبکه ناپایدار یا قطع است، قابلاعتماد نیست.
- استراتژیهای ذخیرهسازی موقت خود را برای هر منبع بازبینی کنید تا مطمئن شوید استراتژی ذخیرهسازی موقت کارگر سرویس شما ارزش خود را ارائه میدهد، بدون اینکه با حافظه پنهان HTTP تداخل داشته باشد.