Manifest V3 : 5 pièges qui m'ont coûté du temps
Les choses que j'aurais aimé savoir avant de migrer mes extensions de Manifest V2 vers V3.
1. Le service worker meurt sans prévenir
En V2, le background page était persistant. En V3, le service worker peut être tué après 30 secondes d'inactivité. Toutes les variables en mémoire disparaissent.
La conséquence : tout état doit aller dans chrome.storage. Et tout traitement long doit être découpé pour pouvoir reprendre après un réveil.
// V2 : marche
let cache = new Map();
// V3 : marche jusqu'au moment où ça marche plus
let cache = new Map();
// V3 : la bonne version
async function getCache() {
const { cache = {} } = await chrome.storage.local.get('cache');
return cache;
}
2. Les content scripts ne peuvent plus injecter de remote code
En V2, on pouvait charger un script depuis un CDN dans une page. En V3, c'est interdit. Tout doit être bundlé.
Si vous avez besoin d'un éval dynamique (rare, mais ça arrive), il faut passer par chrome.scripting.executeScript avec une fonction définie dans votre code source.
3. webRequest blocking est mort
L'API chrome.webRequest ne peut plus bloquer ou modifier les requêtes en V3. Il faut utiliser declarativeNetRequest, qui fonctionne avec des règles statiques pré-déclarées.
C'est plus rapide et plus respectueux de la vie privée, mais beaucoup moins flexible. Si votre extension fait du blocage dynamique complexe (un adblock, par exemple), la migration est non triviale.
4. Les permissions <all_urls> sont scrutées
Google a durci la revue. Demander <all_urls> sans justification très précise dans la description = refus. Il vaut mieux :
- Lister explicitement les domaines (
*://*.example.com/*) - Demander
activeTabquand c'est suffisant - Justifier chaque permission dans la description du store
5. Le storage a des quotas surprenants
chrome.storage.local : 10 Mo (5 Mo en V2). chrome.storage.sync : toujours 100 Ko, avec une limite par item de 8 Ko.
J'ai vu des bugs étranges parce qu'un objet stocké dépassait silencieusement la limite. Pensez à tester chrome.runtime.lastError après chaque set.
En conclusion
La migration V2 → V3 n'est pas qu'une mise à jour de syntaxe. Le modèle d'exécution change. Si votre extension a un état complexe ou fait du networking sophistiqué, prévoyez du temps pour repenser l'architecture.