De los documentos de Nodejs https://nodejs.org/api/modules.html#all-together
require(X) from module at path Y 1. If X is a core module, a. return the core module b. STOP 2. If X begins with '/' a. set Y to be the filesystem root 3. If X begins with './' or '/' or '../' a. LOAD_AS_FILE(Y + X) b. LOAD_AS_DIRECTORY(Y + X) c. THROW "not found" 4. If X begins with '#' a. LOAD_PACKAGE_IMPORTS(X, dirname(Y)) 5. LOAD_PACKAGE_SELF(X, dirname(Y)) 6. LOAD_NODE_MODULES(X, dirname(Y)) 7. THROW "not found" ¿A qué se refiere el número 4?
¿Qué significa que un módulo comience con # ?
LOAD_PACKAGE_IMPORTS(X, DIR) 1. Find the closest package scope SCOPE to DIR. 2. If no scope was found, return. 3. If the SCOPE/package.json "imports" is null or undefined, return. 4. let MATCH = PACKAGE_IMPORTS_RESOLVE(X, pathToFileURL(SCOPE), ["node", "require"]) defined in the ESM resolver. 5. RESOLVE_ESM_MATCH(MATCH). Este es LOAD_PACKAGE_IMPORTS pero me parece un enigma.
El carácter "#" al comienzo de un especificador de importación hace referencia a un campo de importación definido en package.json.
Los campos de importación son útiles para nombres de archivo de alias u otras dependencias a las que solo se accede dentro de un paquete.
Teniendo en cuenta el ejemplo en la documentación:
"imports": { "#dep": { "node": "dep-node-native", "default": "./dep-polyfill.js" } }Cuando un módulo en este paquete contiene una declaración de importación como
import dep from "#def";Esto le dice a Node.js que importe el paquete "dep-node-native"; e indica a otras herramientas de compilación (para el navegador) que usen el archivo local "./dep-polyfill.js".
Esto se explica en https://nodejs.org/api/packages.html#subpath-imports :
Importaciones de subruta
Agregado en: v14.6.0, v12.19.0
Además del campo
"exports", es posible definir mapas de importación de paquetes internos que solo se aplican a los especificadores de importación desde dentro del propio paquete.Las entradas en el campo de importaciones siempre deben comenzar con
#para garantizar que se eliminen de los especificadores de paquetes.
(énfasis mío)