Quiero saber si una pieza de JavaScript se ejecuta en un módulo ES o en un script simple.
Esto es lo que probé hasta ahora:
function isEsm1() { try { // Script gives a syntax error during parsing when script is not an esm return Boolean(import.meta.url); } catch(err) { return false; } } function isEsm2() { // will always return false, because `eval` always seems to be executed in regular script context try { return eval('Boolean(import.meta.url)'); } catch(err) { return false; } } function isEsm3() { // Of course doesn't work, but had to try 😉 return 'meta' in import; }¿Se ejecuta el script normal en el navegador o en otro contexto?
En un navegador, ¿qué tal:
var anyvar = {}; var inModule = anyvar === window.anyvar;Si estás en un módulo, no estás declarando nada en la ventana...
En NodeJS podrías hacer algo similar con global o esto:
let inModule = this === module.exports..Todavía no lo probé... pero debería funcionar, supongo...
Después de la prueba, solo la verificación de this === undefined es suficiente para probar si está ejecutando dentro o fuera de un módulo.
Dentro de un módulo, esto no está definido (según las especificaciones). En el ámbito global, esto apunta a global this, que es el objeto de ventana en el caso de un contexto de navegador...
Gracias a la discusión en la respuesta de John Gorter, creo que hemos encontrado una manera.
console.log('In module: ' + (this === undefined));
Es tan simple como eso. Dentro de un módulo (y solo dentro de un módulo (espero)), this será undefined . Lo encontré en la documentación de v8 aquí: https://v8.dev/features/modules#intro