کارآزمایی منشا کارگران مشترک با طول عمر طولانی

منتشر شده: ۳۱ ژوئیه ۲۰۲۵

از کروم ۱۳٩، در یک آزمایش جدید برای کارگران مشترک با طول عمر طولانی شرکت کنید. این آزمایش یک گزینه جدید extendedLifetime: true اضافه می‌کند تا به کارگران مشترک اجازه دهد پس از آخرین بارگیری سند، زنده بمانند.

مورد استفاده برای ویژگی طول عمر طولانی

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

این پلتفرم وب، چند API برای رسیدگی به برخی از موارد استفاده ساده‌تر ارائه می‌دهد، اما هر کدام محدودیت‌هایی دارند:

  • APIهای جاوا اسکریپت همگام، مانند نوشته‌های localStorage ، قبل از تخلیه صفحه فعلی، تا انتها اجرا می‌شوند.
  • fetch API گزینه‌های مختلفی مانند keepalive و اخیراً fetchLater دارد که به درخواست‌های ارسالی اجازه می‌دهد برای مدت کوتاهی پس از تخلیه سند، همچنان زنده بمانند.

با این حال، این موارد فقط کار همزمان را پوشش می‌دهند، به جز درخواست fetch نهایی. آنها اجازه استفاده از APIهای غیرهمزمان مانند IndexedDB ، Compression Streams یا Web Crypto را برای هش کردن یا رمزگذاری نمی‌دهند. بسیاری از APIها، به ویژه APIهای جدیدتر، غیرهمزمان هستند تا از مسدود شدن نخ اصلی جلوگیری کنند، بنابراین عدم امکان استفاده از این APIها در هنگام تخلیه بار، محدودکننده است.

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

راه حل پیشنهادی

رابط برنامه‌نویسی SharedWorker یک رابط برنامه‌نویسی سبک‌تر است که برای انتقال کار از نخ اصلی استفاده می‌شود. با این حال، در حال حاضر آنها بیشتر از طول عمر مبدأ (زمانی که آخرین صفحه برای آن مبدأ بارگیری می‌شود) عمر نمی‌کنند. کروم پیشنهاد اضافه کردن گزینه جدیدی به رابط برنامه‌نویسی SharedWorker را می‌دهد تا به کارگران مشترک اجازه دهد برای مدت کوتاهی پس از تخریب اسناد، عمر بیشتری داشته باشند.

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

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

فعال کردن طول عمر طولانی

این ویژگی را می‌توان در سایت‌ها برای کاربران با ثبت‌نام در نسخه آزمایشی Origin برای کارکنان اشتراکی با طول عمر طولانی فعال کرد. همچنین توسعه‌دهندگان می‌توانند با استفاده از پرچم chrome://flags/#enable-experimental-web-platform-features را برای مرورگر خود فعال کنند.

کد مثال

پس از انتخاب پرچم آزمایشی یا ویژه، طول عمر طولانی را به شرح زیر فعال کنید:

const myWorker = new SharedWorker("worker.js", { extendedLifetime: true });

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

const sharedWorkerScript = `
  const transaction = db.transaction("analytics", "readwrite");
  const store = transaction.objectStore("analytics");
  const request = store.get("visitCount");
  request.onsuccess = (event) => {
    const newCount = (event.target.result || 0) + 1;
    store.put(newCount, "visitCount");
  };
`;

document.addEventListener("pagehide", () => {
  const blob = new Blob([sharedWorkerScript], { type: "text/javascript" });
  const blobURL = URL.createObjectURL(blob);
  new SharedWorker(blobURL, { extendedLifetime: true });
});

ما همچنین یک برنامه نمونه در اینجا داریم: https://sharedworker-extendedlifetime.netlify.app/ . وقتی صفحه بارگیری مجدد می‌شود (یا ظرف 30 ثانیه بسته و دوباره باز می‌شود)، محاسبه قبلی همچنان در دسترس است.

کارگران مشترک برای سایتی در chrome://inspect/#workers قابل مشاهده هستند و این به زودی بهبود خواهد یافت تا نشان دهد که آیا از گزینه extendedLifetime استفاده شده است یا خیر. کارگران مشترک با طول عمر طولانی نیز به مدت 30 ثانیه پس از بارگیری صفحه در این صفحه نمایش داده خواهند شد.

بازخورد خود را به اشتراک بگذارید

مشتاقانه منتظر شنیدن نظرات شما در مورد طرح آزمایشی «کارگر با حق کار اشتراکی» با طول عمر طولانی هستیم.

شکل API در GitHub مورد بحث قرار گرفته است و ما یک توضیح فنی دقیق‌تر داریم.

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