Si la extensión es básicamente un archivo .js, entonces no sabemos qué es, entonces necesitamos buscar el package.json en el que estamos ejecutando este archivo. Así que necesitamos conocer el contexto. Así que Node.js intenta encontrar el package.json más cercano en el directorio hasta la raíz. Así que verifica para app, my, project, package.json, y así sucesivamente, hasta la raíz. Si no se encuentra, entonces va a asumir otra cosa.
Node.js lo verifica, y siempre que se encuentra el valor de package.json, Node.js verifica el campo type en el package.json. Y si es module, utiliza cargadores ESM, la implementación del cargador en Node.js. Y si no lo es, entonces es CommonJS. Así que si el tipo no está presente, no pudimos encontrar el package.json, ¿qué sucede? Si el tipo no está presente, verificamos una bandera experimental, experimental detect module. Esto es bastante nuevo en Node 20 o 21. Automáticamente verifica si el archivo que estás ejecutando es un archivo CommonJS o un archivo ESM. Esto es particularmente nuevo porque es una bandera experimental, y hay problemas conocidos con ella, pero estamos trabajando en ello.
Así que si tenemos experimental detect module, entonces detectamos si el archivo es un requerido, si es un ESM o un CommonJS. Si no, entonces volvemos a CommonJS. Así que entonces sabemos cómo comienza nuestra aplicación, porque sabemos que el script inicial está escrito en ESM o CommonJS. Pero el problema es, ¿qué sucede si quieres requerir un archivo desde ESM que está implementado en CommonJS? ¿O quieres llamar a una función que es CommonJS o un ESM desde un módulo CommonJS? ¿Qué pasa con la resolución de profundidad de módulo de Node.js? Como si tuvieras módulos de Node implementados, un paquete dentro de tu lista de dependencias, y está implementado en CommonJS o ESM. Así que Node.js verifica el campo type en el package.json de la dependencia. Si es module, utiliza ESM, de lo contrario CommonJS. Si el tipo no está presente, utiliza el tipo del paquete padre, que es el paquete raíz que contiene el package.json de nuestro proyecto.
Así que continuemos con algunos consejos para mejorar el tiempo de carga. Porque hablamos de todos estos cargadores de package.json, llamadas al sistema, hablamos sobre la detección, las extensiones, y así sucesivamente. Así que si quieres evitar todas esas cosas, y si quieres iniciar Node.js lo antes posible, lo que podrías hacer es que, si tienes una aplicación ESM, puedes usar una bandera experimental default type, CLI, que eliminará automáticamente todas esas verificaciones, y siempre devolverá ESM. No verificará la extensión, no verificará nada más, solo cargará el cargador ESM.
Comments