Estoy escribiendo un código JS que se puede usar para la aplicación Node o para la aplicación de navegador web JavaScript .
Desde Node 17.5, ahora es posible usar la fetch API nativa desde JavaScript.
Me pregunto si hay una manera de usar un tipo de importación condicional para el Módulo ES que funcione así:
if fetch exist => use fetch else import fetch from node-fetchHe intentado algo como esto:
if(!fetch) { import fetch from 'node-fetch' } ... fetch(url).then(res => ...) ... Pero genera un error ya que fetch is undefined . Nota: Hice mi prueba usando node@18
¿Alguien tiene una idea para resolver mi problema?
Responder :
Encontré una solución gracias a la respuesta de @Positivity:
let fetcher = fetch ?? await import('node-fetch'); Luego uso fetcher como fetch.
Si cambio el nombre de la variable para fetch , arroja un error:
Cannot access 'fetch' before initializationFinalmente encontré una solución a este error:
if(!fetch) { const fetch = await import('node-fetch'); } // else => fetch is already declaredLa llamada import(), comúnmente llamada importación dinámica, es una expresión similar a una función que permite cargar un módulo ECMAScript de forma asíncrona y dinámica en un entorno potencialmente no modular.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import
por lo que esto debería hacer una importación condicional en las versiones de nodos compatibles:
let fetch = fetch ?? await import('node-fetch')