Esto es algo que me he preguntado desde hace un tiempo. Digamos que tengo una aplicación express. Tengo esta exportación en su propio archivo:
// my-var.js export const myVar = new Thing();Luego tengo la creación del servidor donde accedo a esa variable:
// index.js import { myVar } from './my-var'; import { myRoutes } from './my-routes'; function startServer() { myVar.doSomething(); /* 1 */ const app = express(); app.use('/', myRoutes); app.listen(port, () => {}); }Finalmente, tengo mis rutas, que también usan esa variable:
// my-routes.js import { Router } from 'express'; import { myVar } from './my-var'; const router = new Router(); router.get((req, res) => { myVar.doSomething(); /* 2 */ res.json({}); }); Entonces mi pregunta es: ¿.1 y .2 hacen referencia a la misma variable? ¿O ha sido instanciado dos veces? Creo que se crea una instancia cada vez que se importa el archivo, porque al importar un archivo se ejecuta el código en ese archivo. Entonces myVar = new Thing(); se ejecuta cada vez que se ejecuta ese archivo.
El archivo de script se ejecuta una vez y hay un solo resultado de ese archivo. Si se exporta algún objeto, todos los módulos se referirán a la misma instancia de ese objeto.
const myVar = new Thing(); myVar se crea solo una vez y luego se exporta.
Puede intentar cambiar una propiedad en un módulo y verificar esa propiedad en otro para estar seguro.
Eso es lo que llamamos un diseño de paquete de patrón único , cuando lo haces así:
export const myVar = new Thing()Solo crea la instancia de Thing una vez, y luego, cada vez que la importa, está importando la misma instancia, porque ahora es una referencia.
Si desea obtener una nueva referencia cada vez que se importa myVar , cambie el código
de:
export const myVar = new Thing()A
export const myVar = () => new Thing()Y cuando lo importes, úsalo de la siguiente manera:
import { myVar } from './my-var' const instance = myVar() // returns a new instance from Thing // use the instance here, ex: instance.color