Búsqueda de sitios web

reactjs - No se pueden configurar importaciones de módulos absolutas en un monorepo


Estoy intentando configurar importaciones absolutas en un proyecto de React/TypeScript, pero no puedo encontrar una solución para mi caso. Siempre obtengo el mismo error:

ERROR in ./src/app/App.tsx 18:14-37

Module not found: Error: Can't resolve 'common/hooks' in '/home/artem/Desktop/drum-school/webapp/src/app'

La validación de VSCode no resalta ningún error con mis importaciones, pero al compilar ocurre este error. Probé diferentes variaciones de tsconfig.json, pero el error persiste. Aquí está mi configuración actual:

{
  "compilerOptions":{
    "jsx": "react-jsx",
     "module":"CommonJS",
     "moduleResolution":"node",
     "noImplicitAny":true,
     "outDir":"./public/",
     "preserveConstEnums":true,
     "removeComments":true,
     "sourceMap":true,
     "target":"es5",
     "baseUrl": "src",
  },
  "include": ["src"]
} 

También intenté "baseUrl": "./src", "baseUrl": "./", "baseUrl": "." con paths, pero aún sin efecto.

Una de las importaciones:

import { useTypedSelector } from "common/hooks";

common/hooks.ts:

import { useDispatch, useSelector } from "react-redux";
import type { TypedUseSelectorHook } from "react-redux";
import type { RootState, AppDispatch } from "app/store";

const useTypedDispatch = () => useDispatch<AppDispatch>();
const useTypedSelector: TypedUseSelectorHook<RootState> = useSelector;

export { useTypedDispatch, useTypedSelector };

Supuse que este error puede ocurrir porque nuestro equipo está usando un monorepo. Aquí está la estructura de archivos:

├── backend
│   ├── backend-files
│   └── backend-files
│       
└── webapp
    ├── package.json
    ├── tsconfig.json
    └── src
        ├── app
        │    ├──App.tsx     (import is here)
        │    └──otherFiles
        ├── common
        │    ├──hooks.ts    (export is here)
        │    └──otherFiles
        ├── otherFiles
        └── index.tsx

Estaré agradecido si me explicas qué estoy haciendo mal y me muestras cómo resolver el problema. ¡Gracias!

Respuesta #1

¡Finalmente encontré la solución!

En tsconfig.json:

"baseUrl": ".",
"paths": {
   "common/*": ["src/common/*"],
   "app/*": ["src/app/*"]
}

También agrega

resolve: {
   alias: {
      "common": path.resolve(__dirname, 'src/common/'),
      "app": path.resolve(__dirname, 'src/app/'),
   },
   extensions: ['.ts', '.tsx', '.js', '.jsx', '.json']
},

al archivo de configuración de webpack.