Estoy tratando de escribir un paquete para uso de servidor y cliente con la menor modificación necesaria.
Algunas librerías son parte de Node pero no están incluidas en un navegador, otras están disponibles en un navegador pero no en Node.
Usando https://github.com/lmaccherone/node-localstorage por ejemplo, quiero require la biblioteca cuando estoy en Node, pero en un navegador, localStorage ya está disponible.
Me gustaría verificar si localStorage está disponible con una declaración de declaración que se encuentra en https://stackoverflow.com/a/65755447/2875404 para que se vea así:
declare var localStorage: any | undefined; if (typeof localStorage === "undefined" || localStorage === null) { console.log("need to use Node localStorage") var LocalStorage = require('node-localstorage').LocalStorage; var localStorage = new LocalStorage('./localStorage'); } else { console.log("using Browser localStorage") } Después de envolver el paquete en el paquete web y, para una prueba, ejecutarlo en un fragmento de código de Chrome, aparece el mensaje "need to use Node localStorage" en la consola. Si edito manualmente el código del paquete web en console.log(localStorage) , en realidad imprime el almacenamiento local (por lo que debe estar allí), además, cuando elimino todo el bloque if (typeof... , el código que accede localStorage parece para correr bien.
¿Qué debo hacer exactamente para que esta función de "decisión híbrida" funcione? ¿Puede esto tener que ver con el paquete web que de alguna manera pone las cosas en un alcance "más profundo" que no tiene acceso a las variables de ventana como localStorage? Pero, ¿por qué es posible imprimir e interactuar con la clase entonces? Estoy confundido.
Como dije en el comentario, puede usar la window global para verificar si está en el contexto del navegador:
declare var localStorage: any | undefined; if (typeof window === 'undefined') { console.log("need to use Node localStorage") var LocalStorage = require('node-localstorage').LocalStorage; var localStorage = new LocalStorage('./localStorage'); } else { console.log("using Browser localStorage") }