Búsqueda de sitios web

javascript - El mapeo de rutas de Typescript no se está traduciéndo en la aplicación de node


Actualmente estoy usando TypeScript en una aplicación de Node.js. He compilado mi aplicación y estoy usando la función de mapeo de rutas de TypeScript.

'api/*' en su lugar debería buscar en la carpeta raíz. Usar lo siguiente en desarrollo funciona:

nodemon --watch src -e ts,tsx --exec ts-node -r tsconfig-paths/register --disableWarnings ./src/index.ts

tsconfig-paths/register permite que el require se traduzca correctamente y ts-node ejecutará/correrá la aplicación correctamente. Ahora, el problema surge cuando paso a producción. En el pasado, en producción, simplemente ejecutaba tsc en la carpeta, y movía el contenido de outDir (dist/) a /app en mi imagen de Docker, y ejecutaba node /app/index.js. Esto ha funcionado hasta que comencé a usar la función de mapeo de rutas de TypeScript. Ahora simplemente obtengo el error:

Error: No se puede encontrar el módulo 'api/module/path/here'

Según este comentario de GitHub, aparentemente los nombres de los módulos no están asociados con el JavaScript compilado de salida.

Mi archivo tsconfig.json:

{
    "compilerOptions": {
      "target": "es2015",
      "module": "commonjs",
      "moduleResolution": "node",
      "allowSyntheticDefaultImports": true,
      "jsx": "react",
      "allowJs": true,
      "alwaysStrict": true,
      "sourceMap": true,
      "forceConsistentCasingInFileNames": true,
      "noFallthroughCasesInSwitch": true,
      "noImplicitReturns": true,
      "noUnusedLocals": true,
      "noUnusedParameters": true,
      "noImplicitAny": false,
      "noImplicitThis": false,
      "strictNullChecks": false,
      "experimentalDecorators": true,
      "emitDecoratorMetadata": true,
      "lib": ["es2017", "dom"],
      "baseUrl": "src",
      "outDir": "dist",
      "types": [
        "node"
      ],
      "paths": {
        "universal/*": ["../../universal/*"],
        "api/*": ["*"],
        "*": ["node_modules/*"]
      },
      "typeRoots": [
        "./node_modules/@types",
        "./src/types"
      ]
    },
    "include": [
      "src/**/*"
    ]
}

¿Cuál es el enfoque recomendado para usar el mapeo de rutas relativas en un entorno node.js? Si TypeScript es quien realiza la resolución, ¿por qué no debería reescribir las declaraciones require? Parece absurdo involucrar otro paso como babel o webpack solo para agregar la funcionalidad que TypeScript ya está proporcionando con la resolución de módulos.

EDITAR: Después de investigar un poco más, encontré que podría usar -r tsconfig-paths/register en mi entorno de Node (solo tengo que copiar mi archivo tsconfig.json). Puedo cambiar mi punto de entrada en Docker a:

ENTRYPOINT [ "node", "-r", "tsconfig-paths/register", "index.js" ]

El problema es que ahora necesito modificar mi tsconfig.json baseUrl, ya que el directorio src/ no existe. Además, noté que la resolución no está funcionando para el módulo 'util' (aparentemente está usando util en mi carpeta node_modules en lugar de la biblioteca util de node.js), lo que está causando que mi aplicación se bloquee.

Respuesta #1

Según la fuente que suministraste, podrías ser capaz de usar (por ejemplo, resolver la última ruta COMO la primera ruta):

"rootDirs": [
      "src/api/module/path/here",
      "api/module/path/here"
    ]

El problema es que ahora necesito modificar el baseUrl de mi tsconfig.json, ya que el directorio src/ no existe.

La función de mapeo de rutas de TypeScript indica:

La flexibilidad de rootDirs no se limita a especificar una lista de directorios de origen físicos que se fusionan lógicamente. El arreglo proporcionado puede incluir cualquier número de nombres de directorios ad hoc y arbitrarios, independientemente de si existen o no. Esto permite al compilador capturar características sofisticadas de agrupación y ejecución en tiempo de ejecución, como inclusión condicional y complementos de carga específicos del proyecto, de manera segura en cuanto a tipos.

Además, ¿probaste Rastrear la resolución de módulos: tsc --traceResolution

Artículos relacionados