Tengo una extensión de trabajador de servicio que usa muchos valores y definiciones codificados. Por ejemplo, tenemos un protocolo propietario que define ciertos tipos de mensajes que se identifican con números enteros:
const MsgType = { MSG_TYPE_1: 0, // not really called like this, just an example MSG_TYPE_2: 1 };Según tengo entendido, no se puede confiar en variables globales en los trabajadores de servicios. Como tal, usar constantes para valores codificados no funcionará. JS no tiene ninguna otra forma de establecer dichos valores codificados.
Solo puedo pensar en tres formas de lidiar con esto:
1- Solo use valores codificados en todo su código. me niego a hacer esto....
2- usar funciones para devolver el valor como
function MsgType() { return { MSG_TYPE_1: 0, MSG_TYPE_2: 1 } }3- reemplace const con let y haga que una función reinicie todo:
let MsgType = null; function setEveryConstantEverywhere() { if (MsgType != null) { return; } // set everything } // in code where SW is expected to wake up then call setEveryConstantEverywhere right at the start.¿Hay otra manera? ¿Estoy entendiendo todo esto mal?
Bien, realicé algunas pruebas empíricas y ahora tengo una mejor comprensión.
1- Cada vez que se vuelve a cargar el trabajador del servicio de extensión, se evalúa el contexto global completo ANTES de que se invoquen los controladores de eventos. Esto implica que las constantes globales se están redefiniendo
2- Se puede incluir una referencia a un objeto y estará disponible en el controlador de eventos. Sin embargo, si el SW se ha reiniciado, la referencia será a la instancia recién creada y no a la configurada antes de reiniciar:
const obj = {/*...*/}; chrome.webRequest.onBeforeRequest.addListener((context => _ => { context === obj; // true })(obj) ,/*...*/);Intuitivamente, uno pensaría que la instancia del controlador de eventos que se llama es la que se estableció antes de detener el SW, sin embargo, esto no es así. De hecho, parece que todo se borra por completo, luego se inicializa el SW (ejecuta todo el código en el ámbito global) y solo entonces se envía el evento.