實作非持續性背景指令碼可大幅降低擴充功能的資源成本。事件導向背景指令碼可支援大多數擴充功能。只有在極少數情況下,擴充功能才應有持續執行的背景,因為這類背景會不斷消耗系統資源,導致低功率裝置負載過重。
將持續性背景指令碼遷移至以事件為基礎的非持續性模型,提升擴充功能效能。預設值為 true。"persistent"
將持續性指定為 false
在擴充功能資訊清單檔案中找出 "background" 鍵,然後將 "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
})
記錄儲存空間中的狀態變更
使用 Storage 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()
})
});