node.js - typescript 4.4.4: tsconfig-vägar löses inte som förväntat


min tsconfig.json

{
  "compilerOptions": {
    "target": "ES2018",
    "module": "CommonJS",
    "lib": ["ESNext", "ESNext.AsyncIterable"],
    "skipLibCheck": true,
    "sourceMap": true,
    "outDir": "./dist",
    "moduleResolution": "node",
    "removeComments": true,
    "noImplicitAny": true,
    "strictNullChecks": true,
    "strictFunctionTypes": true,
    "noImplicitThis": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": true,
    "allowSyntheticDefaultImports": true,
    "esModuleInterop": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "resolveJsonModule": true,
    "baseUrl": "./",
    "paths": {
      "@/*": ["src/*"],
      "@config": ["src/config"],
    }
  },
  "exclude": ["node_modules"],
  "include": ["./src/**/*.ts"]
}

Jag är ganska säker på att det inte är något fel på tsconfig-sökvägar eftersom jag till och med får sökvägskomplettering från mitt IDE. dock när min kod kompileras (tsc --project tsconfig.json)

import { PRODUCTION } from '@config';

// or

import { PRODUCTION } from '@/config';

Jag får följande javascript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const _config_1 = require("@config");
console.log(_config_1.PRODUCTION);
//# sourceMappingURL=index.js.map

men javascript förstår inte vad "@" är därför får jag felet "module not found". Hur kan jag lösa detta problem?

Svar #1

Se detta problem på TypeScripts GitHub-projekt: Modulvägskartor löses inte i genererad kod (#10866)

sammanfattning

  • TypeScript kommer inte att skriva om dina modulvägar
  • paths designades för att hjälpa TypeScript att förstå sökvägsalias som används av bundlers
  • Du måste antingen:

    • använd en bundlare, såsom webpack, och konfigurera dess egna sökkartor
    • använd ett byggtidsverktyg, såsom tspath, för att skriva om sökvägarna
    • ändra runtime-modulupplösaren, med något som module-alias

Svar #2

Jag har fastnat med detta problem i hela 2 dagar och försökt hitta något som fungerar. @Wings svar är korrekt, om du använder vanlig tsc utan andra verktyg, då kommer Node inte veta vad du menar med @/ (eller vad din alias än är) i dina imports.

Jag har provat några olika tillvägagångssätt och jag har hittat ett som inte krävde någon konfiguration.

Vad fungerade:

I slutet av min resa snubblade jag över ett paket som fortfarande aktivt underhålls: tsc-alias. Det enda jag behövde göra var att lägga till && tsc-alias -p tsconfig.json i mitt tsc-kommando i mitt byggskript och voilà, det fungerar. Så ditt fullständiga kommando skulle vara något som tsc -p tsconfig.json && tsc-alias -p tsconfig.json.

Vad jag försökte som inte fungerade:

  • Jag försökte med "module-alias" och jag kunde inte få det att fungera.
  • Jag provade "tsconfig-paths" som föreslagits av @AlexMorley-Finch utan framgång också. Paketet verkar hitta modulerna, men det verkar finnas en bugg som gör att sökvägen till modulerna inte mappas korrekt (det finns ett öppet ärende för det).
  • Jag stötte då på tscpaths. Detta paket kräver att du uttryckligen anger ditt projekt, src-katalog och out-katalog. Jag fick det att fungera efter att jag listat ut att min outdir behövde vara ./build/src istället för ./build. Varning här: detta paket har inte rörts sedan maj 2019 vid skrivande stund.

Relaterade artiklar