Para eliminar las variables globales utilizadas en un script de fondo de MV2 al migrar a un trabajador de servicio de MV3, todas las guías que he encontrado solo dan un ejemplo de cómo reemplazar una única variable global con unas pocas líneas de configuración y luego usar chrome.storage , pero todavía no me queda claro cómo se puede usar en un escenario un poco más complicado.
Por ejemplo:
const activatedTabs = []; let lastActiveTabInfo; chrome.tabs.onActivated.addListener((activeInfo) => { if (activatedTabs.length === 0) { activatedTabs.push(activeInfo.tabId); lastActiveTabInfo = activeInfo; } }¿Cómo podría refactorizarse el fragmento anterior para usar chrome.storage y eliminar las variables globales?
El número de variables en el estado no cambia el enfoque:
Para datos pequeños (1 MB en total), use chrome.storage.session, que está en la memoria, es decir, no escribe en el disco; de lo contrario, use chrome.storage.local. Ambos solo pueden almacenar tipos compatibles con JSON, es decir, cadena, número, booleano, nulo, matrices/objetos de dichos tipos. También hay IndexedDB para Blob o Uint8Array.
let activatedTabs; let lastActiveTabInfo; let busy = chrome.storage.session.get().then(data => { activatedTabs = data.activatedTabs || []; lastActiveTabInfo = data.lastActiveTabInfo; busy = null; }); const saveState = () => chrome.storage.session.set({ activatedTabs, lastActiveTabInfo, }); chrome.tabs.onActivated.addListener(async info => { if (!activatedTabs.length) { if (busy) await busy; activatedTabs.push(info.tabId); lastActiveTabInfo = info; await saveState(); } });También puede mantener un solo objeto con propiedades en su lugar:
const state = { activatedTabs: [], lastActiveTabInfo: null, }; const saveState = () => chrome.storage.session.set({ state }); let busy = chrome.storage.session.get('state').then(data => { Object.assign(state, data.state); busy = null; }); chrome.tabs.onActivated.addListener(async info => { if (!state.activatedTabs.length) { if (busy) await busy; state.activatedTabs.push(info.tabId); state.lastActiveTabInfo = info; await saveState(); } });Tenga en cuenta que si se suscribe a eventos frecuentes como tabs.onActivated, su trabajador de servicio puede reiniciarse cientos de veces al día, lo que desperdicia muchos más recursos que mantener una página de fondo persistente inactiva. El equipo de Chromium ignora este problema, pero tú no deberías y, afortunadamente, hay una manera de reducir la cantidad de reinicios al prolongar la vida útil del software . Todavía necesita leer/guardar el estado como se muestra.