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. Por lo tanto, Node.js intenta encontrar el package.json más cercano en el directorio hasta la raíz. Por lo tanto, verifica app, my, project, package.json, y así sucesivamente, hasta la raíz. Si no se encuentra, entonces asumirá algo más.
Node.js lo verifica y cuando se encuentra el valor package.json, Node.js verifica el campo type en package.json. Si es module, utiliza los cargadores ESM, la implementación de cargadores en Node.js. Y si no lo es, entonces es CommonJS. Entonces, si el tipo no está presente, no pudimos encontrar el package.json, ¿qué sucede? Si el tipo no está presente, se verifica una bandera experimental, experimental detect module. Esto es bastante nuevo en Node 20 o 21. Verifica automáticamente 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.
Entonces, si tenemos experimental detect module, entonces detectamos si el archivo es requerido, si es un ESM o un CommonJS. Si no, entonces volvemos a CommonJS. 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? Entonces, ¿qué pasa con la resolución de profundidad de módulos de Node.js? Como si tienes módulos de Node implementados, un paquete dentro de tu lista de dependencias, y está implementado en CommonJS o ESM. 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.
Continuemos con algunos consejos para mejorar el tiempo de carga. Porque hablamos de todos estos cargadores de package.json, llamadas al sistema, hablamos de la detección, las extensiones, y así sucesivamente. Entonces, si quieres evitar todas esas cosas y si quieres iniciar Node.js lo antes posible, lo que puedes hacer es, si tienes una aplicación ESM, puedes usar la bandera experimental default type CLI, que eliminará automáticamente todas esas comprobaciones y siempre devolverá ESM. No verificará la extensión, no verificará nada más, simplemente cargará el cargador ESM. Para proyectos existentes, utiliza un campo type en package.json para especificar el tipo de módulo. Si no tienes un tipo CommonJS, entonces asumimos que es CommonJS, pero si lo tienes, te recomiendo que lo uses. Para scripts de una sola vez, digamos que quieres ejecutar Node.index.js y no tienes package.json ni nada más. Así que si estás ejecutando un script de una sola vez, asegúrate de tener en el mismo directorio o en el directorio padre, un package.json con un campo type para que sepamos si es un ESM o un CommonJS, y no tengamos que recorrer todo el sistema de archivos en una ruta de archivo para entender si es ESM o CommonJS. Si no quieres hacer eso, si no quieres tener un package.json, debes usar .mgs para ESM y .cgs para CommonJS. Por supuesto, esto nos indica si es un ESM o un CommonJS. Además, puedes usar experimental detect module si solo quieres escribir .gs, pero no quieres preocuparte por las extensiones o package.json, siempre puedes usar experimental detect module. Pero ten en cuenta que esta es una bandera experimental y tiene algunos problemas. Además, lo primero que puedes hacer es usar experimental default module para ESM si quieres ir directamente al camino ESM. Para mejorar la resolución de módulos, como dije, por defecto, verificamos .gs, .json, y así sucesivamente. Siempre usa extensiones en las llamadas de importación requeridas. Esto es extremadamente importante. En ESM, esto es requerido. En CommonJS, no lo es. Pero te recomendamos que siempre uses extensiones. Gracias por escuchar y espero que hayas aprendido algo hoy.
Comments