Di chuyển sang tập lệnh nền dựa trên sự kiện

Việc triển khai tập lệnh nền không liên tục sẽ giúp giảm đáng kể chi phí tài nguyên của tiện ích. Hầu hết chức năng của tiện ích đều có thể được hỗ trợ bằng tập lệnh nền dựa trên sự kiện. Chỉ trong một số ít trường hợp, tiện ích mới có chế độ nền liên tục, vì các tiện ích này liên tục tiêu thụ tài nguyên hệ thống và có thể gây căng thẳng cho các thiết bị có công suất thấp hơn.

Cải thiện hiệu suất của tiện ích bằng cách di chuyển tập lệnh nền ổn định sang mô hình không ổn định dựa trên sự kiện. Theo mặc định, "persistent" được đặt thành true.

Chỉ định tính chất ổn định là false

Tìm khoá "background" trong tệp manifest của tiện ích, sau đó thêm hoặc cập nhật trường "persistent" thành false.

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

Điều này cũng áp dụng cho các tập lệnh trong nền dựa trên tệp HTML.

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

Trình nghe sự kiện trên bề mặt

Trình nghe phải ở cấp cao nhất để kích hoạt tập lệnh ở chế độ nền nếu một sự kiện quan trọng được kích hoạt. Bạn có thể cần phải cấu trúc lại trình nghe đã đăng ký thành mẫu đồng bộ. Việc tạo cấu trúc trình nghe như bên dưới sẽ không cho phép gọi các trình nghe đó vì chúng không được đăng ký đồng bộ.

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

Thay vào đó, hãy giữ người nghe ở mức cao nhất và không lồng ghép vào nhau.

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

Ghi lại các thay đổi về trạng thái trong bộ nhớ

Sử dụng API bộ nhớ để đặt và trả về trạng thái và giá trị. Sử dụng local.set để cập nhật trên máy cục bộ.

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

Sử dụng local.get để lấy giá trị của biến đó.

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

Biến đồng hồ hẹn giờ thành chuông báo

Các bộ hẹn giờ dựa trên DOM, chẳng hạn như window.setTimeout() hoặc window.setInterval(), sẽ không được thực thi trong các tập lệnh nền không liên tục nếu các bộ hẹn giờ này kích hoạt khi trang sự kiện ở trạng thái rảnh.

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

Thay vào đó, hãy sử dụng API chuông báo.

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

Sau đó, hãy thêm trình nghe.

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

Cập nhật lệnh gọi cho các hàm tập lệnh trong nền

Nếu sử dụng extension.getBackgroundPage để gọi một hàm từ trang ở chế độ nền, hãy cập nhật lên runtime.getBackgroundPage. Phương thức mới hơn sẽ kích hoạt tập lệnh không ổn định trước khi trả về tập lệnh đó.

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

Phương thức này sẽ không hoạt động nếu tập lệnh nền không hoạt động, đây là trạng thái mặc định cho tập lệnh không ổn định. Phương thức mới hơn bao gồm một hàm gọi lại để đảm bảo tập lệnh trong nền đã tải.

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