es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Descartar y volver a importar la importación dinámica

Tengo un archivo de configuración de JS exportado como un módulo CJS que me gustaría analizar y hacer algo con él cada vez que se detecte un cambio. Tengo la función de observación configurada y termina llamando a esta función:

const parseConfig = async (path: string) => {
  let config;

  try {
    config = (await import(path)).default;
  } catch (_) {
    // algo salió mal, tal vez fue mal formateado
  }

  return config;
};

Como puedes ver, estoy usando una importación dinámica para obtener el archivo JS. Esto funciona, excepto por el hecho de que después de ser importado la primera vez, parece que se almacena en caché y no se actualiza después de eso.

¿Hay alguna manera de descartar la importación existente y forzar una nueva importación de un archivo JS importado dinámicamente?

Alternatively, si hay una solución más directa para esto, estoy abierto a sugerencias.

NB: Estoy usando esbuild, por lo que resuelve mis declaraciones de importación por mí; Intenté cambiarlo a una declaración require dinámica ya que es CJS, pero tuvo el mismo efecto.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes forzar la re-importación de un archivo JS importado dinámicamente utilizando la palabra clave delete incorporada en conjunción con el objeto require.cache.

    Aquí tienes un ejemplo de cómo puedes modificar tu función parseConfig para eliminar el módulo en caché y forzar una re-importación:

    const parseConfig = async (path: string) => {
      let config;
    
      // Eliminar el módulo en caché
      delete require.cache[require.resolve(path)];
    
      try {
        config = (await import(path)).default;
      } catch (_) {
        // algo salió mal, tal vez esté mal formateado
      }
    
      return config;
    };
    

    Al eliminar el módulo en caché antes de importarlo nuevamente, puedes asegurarte de tener siempre la versión más reciente del archivo.

Comments are closed.