چرخه عمر کارگر خدمات ترویجی، چرخه عمر کارگر خدمات ترویجی

کارکنان خدمات برنامه افزودنی هم به رویدادهای استاندارد سرویس‌کار و هم به رویدادهای فضای نام برنامه‌های افزودنی پاسخ می‌دهند. آنها با هم ارائه می شوند زیرا اغلب یک نوع در طول استفاده از یک برنامه افزودنی به دنبال دیگری می آید.

نصب و راه اندازی

نصب زمانی انجام می‌شود که کاربر یک سرویس‌دهنده را از فروشگاه وب Chrome نصب یا به‌روزرسانی می‌کند یا زمانی که یک برنامه افزودنی بسته‌نشده را با استفاده از صفحه chrome://extensions بارگیری یا به‌روزرسانی می‌کند. سه رویداد به ترتیب زیر رخ می دهد.

ServiceWorkerRegistration.install

اولین رویدادی که در حین نصب فعال شد، رویداد نصب کارگر وب سرویس است.

chrome.runtime.onInstalled

بعد رویداد onInstalled برنامه افزودنی است که وقتی برنامه افزودنی (نه سرویس‌کار) برای اولین بار نصب می‌شود، زمانی که برنامه افزودنی به نسخه جدید به‌روزرسانی می‌شود و زمانی که Chrome به نسخه جدید به‌روزرسانی می‌شود، فعال می‌شود. از این رویداد برای تنظیم یک وضعیت یا برای مقداردهی اولیه، مانند منوی زمینه استفاده کنید.

chrome.runtime.onInstalled.addListener((details) => {
  if(details.reason !== "install" && details.reason !== "update") return;
  chrome.contextMenus.create({
    "id": "sampleContextMenu",
    "title": "Sample Context Menu",
    "contexts": ["selection"]
  });
});

ServiceWorkerRegistration.active

در نهایت رویداد فعال سازی سرویس کار اخراج می شود. توجه داشته باشید که برخلاف کارگران وب سرویس، این رویداد بلافاصله پس از نصب یک برنامه افزودنی فعال می‌شود، زیرا هیچ چیزی قابل مقایسه با بارگذاری مجدد صفحه در یک برنامه افزودنی نیست.

راه اندازی برنامه افزودنی

وقتی نمایه کاربری شروع می‌شود، رویداد chrome.runtime.onStartup فعال می‌شود اما هیچ رویداد service worker فراخوانی نمی‌شود.

بیکار و خاموش

به‌طور معمول، Chrome وقتی یکی از شرایط زیر برآورده شود، سرویس‌کار را خاتمه می‌دهد:

  • بعد از 30 ثانیه عدم فعالیت دریافت یک رویداد یا تماس با یک برنامه افزودنی API این تایمر را بازنشانی می کند.
  • زمانی که یک درخواست، مانند یک رویداد یا تماس API، بیش از 5 دقیقه طول می کشد تا پردازش شود.
  • زمانی که یک پاسخ fetch() بیش از 30 ثانیه طول می کشد تا برسد.

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

برای بهینه سازی مصرف منابع برنامه افزودنی خود، در صورت امکان از زنده نگه داشتن کارمند خدمات خود به طور نامحدود خودداری کنید. برنامه های افزودنی خود را آزمایش کنید تا مطمئن شوید که این کار را ناخواسته انجام نمی دهید.

به جای استفاده از متغیرهای سراسری، داده های پایدار را حفظ کنید

اگر سرویس‌کار خاموش شود، هر متغیر جهانی که تنظیم کرده‌اید از بین می‌رود. به جای استفاده از متغیرهای سراسری، مقادیر را در حافظه ذخیره کنید. گزینه های شما در زیر لیست شده است. توجه داشته باشید که Web Storage API برای کارکنان خدمات افزونه در دسترس نیست.

chrome.storage API
یک برنامه افزودنی API که انواع مختلفی از ذخیره سازی را ارائه می دهد. محلی، جلسه، مدیریت شده (دامنه) و همگام سازی. این API اشیاء JSON شناسایی و بازیابی شده با کلیدهای تعریف شده توسط توسعه دهنده را ذخیره می کند. وقتی کاربر کش وب را پاک می‌کند، این نوع فضای ذخیره‌سازی حذف نمی‌شود.
IndexedDB API
یک API سطح پایین برای ذخیره سازی داده های ساخت یافته در سمت سرویس گیرنده، از جمله فایل ها و حباب ها. این API مقدماتی را برای ایجاد ذخیره سازی و بازیابی داده های تراکنش فراهم می کند. اگرچه این API اغلب برای موارد استفاده ساده بسیار پیچیده است، تعدادی راه حل ذخیره سازی شخص ثالث در بالای آن ساخته شده است.
CacheStorage API
مکانیزم ذخیره سازی دائمی برای جفت شی Request و Response. این API به طور خاص برای کارکنان خدمات وب طراحی شده است و برای بازیابی داده ها از یک نقطه پایانی استفاده می شود. روش های مختلفی برای استفاده از این API وجود دارد که بستگی به این دارد که آیا و چقدر مهم است که کاربران داده های به روز را ببینند. برای اطلاعات بیشتر، به کتاب آشپزی آفلاین مراجعه کنید. مگر اینکه به طور خاص درخواست های شبکه را از طریق واکشی کنترل کننده پروکسی کنید، باید از chrome.storage استفاده کنید.

حداقل نسخه کروم را انتخاب کنید

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

کروم 120

اکنون می توان آلارم ها را روی حداقل 30 ثانیه تنظیم کرد تا با چرخه عمر کارگر خدمات مطابقت داشته باشد. برای جزئیات بیشتر به chrome.alarms مراجعه کنید.

کروم 118

جلسات اشکال زدا فعال ایجاد شده با استفاده از chrome.debugger API اکنون سرویس دهنده را زنده نگه می دارد. این مانع از اتمام زمان سرویس‌دهندگان در طول تماس‌های این API می‌شود.

کروم 116

Chrome 116 بهبودهای مادام العمر سرویس کارمند زیر را معرفی کرد:

  • اتصالات WebSocket فعال اکنون طول عمر کارکنان خدمات توسعه را افزایش می دهد. ارسال یا دریافت پیام از طریق یک WebSocket در یک کارگر خدمات توسعه، تایمر غیرفعال کارگر سرویس را بازنشانی می کند.

  • APIهای برنامه افزودنی اضافی مجاز هستند از مدت زمان توقف پنج دقیقه ای برای کارکنان خدمات توسعه عبور کنند. این API ها یک درخواست کاربر را نمایش می دهند و بنابراین ممکن است به طور منطقی رفع آنها بیش از پنج دقیقه طول بکشد. اینها شامل desktopCapture.chooseDesktopMedia() ، identity.launchWebAuthFlow() ، management.uninstall() و permissions.request() می باشد.

کروم 114

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

کروم 110

تماس‌های API برنامه‌های افزودنی تایمرها را بازنشانی می‌کنند. قبل از این، تنها کنترل‌کننده‌های رویداد در حال اجرا می‌توانست یک سرویس‌کار را زنده نگه دارد. هر رویدادی که در صف قرار می گیرد، اما کنترل کننده برای آن فراخوانی نشده است، باعث بازنشانی نمی شود.

کروم 109

پیام‌های ارسال شده از یک سند خارج از صفحه، تایمرها را بازنشانی می‌کنند.

کروم 105

اتصال به یک میزبان پیام‌رسان بومی با استفاده از chrome.runtime.connectNative() یک سرویس‌کار را زنده نگه می‌دارد. اگر فرآیند میزبان از کار بیفتد یا خاموش شود، درگاه بسته می‌شود و پس از تکمیل تایمر، سرویس‌کار خاتمه می‌یابد. با فراخوانی chrome.runtime.connectNative() در کنترل کننده رویداد onDisconnect پورت از این موضوع محافظت کنید.