實作非永久性的背景指令碼可大幅降低擴充功能的資源成本。大多數擴充功能功能都支援以事件為基礎的背景指令碼。只有在極少情況下,擴充功能才應具有持續運作的背景,因為擴充功能會不斷耗用系統資源,且可能會在低功耗裝置上造成負荷。
將永久背景指令碼遷移至事件型非永久模型,提升擴充功能的效能。"persistent"
的預設值為 true,
將持續性指定為 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);
請改用 alarms 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()
})
});