Obtuve un proyecto de aplicación web de nodo que usa JS normal.
Estoy tratando de establecer algunas rutas usando jsconfig.json . Intenté usar las Subpath imports predeterminadas del nodo e incluso si funciona, vscode intellisense dejó de funcionar.
Descubrí que podía usar jsconfig.json , así que configuré este archivo
{ "compilerOptions": { "target": "es6", "module": "commonjs", "baseUrl": "./", "paths": { "@controllers/*": ["node/controllers/*"], }, }, "exclude": ["node_modules"] } Y en mi package.json agregué
"type": "module",Mi estructura de carpetas es
├── node │ └──controllers │ └── foo.js ├── server.js ├── jsconfig.json └── package.json Pero cuando intento importar desde server.js
import { foo } from '@controllers/foo.js' // or import { foo } from '@controllers/foo' foo.js
export const foo = 'Hello server'yo obtengo
node:internal/process/esm_loader:74 internalBinding('errors').triggerUncaughtException( Error [ERR_MODULE_NOT_FOUND]: Cannot find package '@controllers/foo.js' imported from /Users/Alvaro/Sites/test/server.js at new NodeError (node:internal/errors:363:5) at packageResolve (node:internal/modules/esm/resolve:698:9) at moduleResolve (node:internal/modules/esm/resolve:739:18) at Loader.defaultResolve [as _resolve] (node:internal/modules/esm/resolve:853:11) at Loader.resolve (node:internal/modules/esm/loader:89:40) at Loader.getModuleJob (node:internal/modules/esm/loader:242:28) at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:73:40) at link (node:internal/modules/esm/module_job:72:36) { code: 'ERR_MODULE_NOT_FOUND'Después de horas de investigación, descubrí que es muy difícil tener una ruta de alias personalizada al usar esm y muy fácil de configurar para commonjs ,
pero se puede lograr, de una manera ligeramente diferente cuando usa esm , escribiré la solución para la implementación de esm en el método 1 y luego para commonjs en el método 2
Método 1
Paso 0:
eliminar jsconfig.json
Paso 1:
en su package.json agregue una propiedad de exports ,
"name": "package-name" "exports":{ "./@controllers/" : "./node/controllers/" } Nota: no olvide el '/' después de @controllers y /node/controllers/
Paso 2
tendrás que importar el archivo
import {foo} from "package-name/controllers/index.js" /* package-name is the same value as the 'name' property in the package.json */ para obtener más información sobre la propiedad de exports en package.json , consulte aquí
------------------------------XXXXXXXXX------------------- ---------------
Método 2
no puedes usar es modules en este método
Paso 0
instale el paquete module-alias .
npm i module-alias
elimine type:module si existe en package.json o cambie el valor a commonjs ;
Paso 1
Agregue el siguiente código en la línea de inicio del archivo que se especifica como entry point en package.json
require(module-alias/register)
verifique la propiedad main en package.json en el caso del autor, debería ser server.js .
en package.json agrega esto
"_moduleAliases": { "@root" : ".", // Don't forget to mnetion this "@controllers" : "node/controllers/*" }Ahora puede requerir módulos de directorios como a continuación
const {foo} = require("@controllers/foo.js") // if foo is named export //or const foo = require("@controllers/foo.js"); puede consultar más sobre la biblioteca module-alias aquí
Lo que has probado es casi correcto.
puede hacer que los alias funcionen, pero tiene que comenzar con # .
por ejemplo: en package.json
"imports": { "#app": "./app.js" } y en jsconfig.json
{ "compilerOptions": { "paths": { "#app": ["./app.js"] } } }