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
pathsdesignades för att hjälpa TypeScript att förstå sökvägsalias som används av bundlersDu 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/srcistället för./build. Varning här: detta paket har inte rörts sedan maj 2019 vid skrivande stund.