به اسکریپت های پس زمینه رویداد محور مهاجرت کنید

پیاده‌سازی اسکریپت‌های پس‌زمینه غیرمداوم، هزینه منابع افزونه شما را تا حد زیادی کاهش می‌دهد. اکثر قابلیت‌های افزونه را می‌توان توسط یک اسکریپت پس‌زمینه مبتنی بر رویداد پشتیبانی کرد. فقط در شرایط نادر، یک افزونه باید پس‌زمینه مداوم داشته باشد، زیرا آنها دائماً منابع سیستم را مصرف می‌کنند و می‌توانند باعث فشار بر دستگاه‌های کم‌مصرف‌تر شوند.

با انتقال یک اسکریپت پس‌زمینه‌ی پایدار به یک مدل غیرپایدار مبتنی بر رویداد، عملکرد یک افزونه را بهبود بخشید. به طور پیش‌فرض، "persistent" روی true تنظیم شده است.

پایداری را به عنوان نادرست تعیین کنید

کلید "background" را در فایل manifest افزونه پیدا کنید، سپس فیلد "persistent" را به false اضافه یا به‌روزرسانی کنید.

{
  "name": "My extension",
  ...
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  ...
}

همین امر در مورد اسکریپت‌های پس‌زمینه که به یک فایل HTML متکی هستند نیز صدق می‌کند.

{
  "name": "My extension",
  ...
  "background": {
    "page": "background.html",
    "persistent": false
  },
  ...
}

شنوندگان رویداد سطحی

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

chrome.storage.local.get('runtimeEvents', function (events) {
  for (let event of events)
    chrome.runtime[event].addListener(listener);
});

در عوض، شنونده‌ها را در سطح بالا و بدون تودرتو نگه دارید.

chrome.runtime.onStartup.addListener(function() {
  // run startup function
})

ثبت تغییرات وضعیت در فضای ذخیره‌سازی

از API ذخیره‌سازی برای تنظیم و بازگرداندن حالت‌ها و مقادیر استفاده کنید. local.set برای به‌روزرسانی روی دستگاه محلی استفاده کنید.

  chrome.storage.local.set({ variable: variableInformation });

برای دریافت مقدار آن متغیر از local.get استفاده کنید.

chrome.storage.local.get(['variable'], function(result) {
  let awesomeVariable = result.variable;
  // Do something with awesomeVariable
});

تبدیل تایمر به آلارم

تایمرهای مبتنی بر DOM، مانند window.setTimeout() یا window.setInterval() ، اگر هنگام غیرفعال بودن صفحه رویداد فعال شوند، در اسکریپت‌های پس‌زمینه غیرپایدار مورد استفاده قرار نمی‌گیرند.

let timeout = 1000 * 60 * 3;  // 3 minutes in milliseconds
window.setTimeout(function() {
  alert('Hello, world!');
}, timeout);

در عوض، از API هشدارها استفاده کنید.

chrome.alarms.create({delayInMinutes: 3.0})

سپس یک شنونده اضافه کنید.

chrome.alarms.onAlarm.addListener(function() {
  alert("Hello, world!")
});

به‌روزرسانی فراخوانی‌ها برای توابع اسکریپت پس‌زمینه

اگر از extension.getBackgroundPage برای فراخوانی یک تابع از صفحه پس‌زمینه استفاده می‌کنید، آن را به runtime.getBackgroundPage به‌روزرسانی کنید. متد جدیدتر، اسکریپت غیرپایدار را قبل از بازگرداندن آن فعال می‌کند.

function backgroundFunction() {
  alert('Background, reporting for duty!')
}
document.getElementById('target').addEventListener('click', function(){
  chrome.extension.getBackgroundPage().backgroundFunction();
});

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

document.getElementById('target').addEventListener('click', function() {
  chrome.runtime.getBackgroundPage(function(backgroundPage){
    backgroundPage.backgroundFunction()
  })
});