node.js - Typescript se compilează cu succes, dar node nu poate găsi modulul
Eroare Node Error: Cannot find module 'hello' chiar dacă Typescript a compilat cu succes.
Structura directorului (rețineți că aceasta este aproape identică cu documentația tsconfig pentru baseUrl)
main
| src
| ├─ index.ts
| └─ hello
| └── index.ts
└── tsconfig.json
└── package.json
Vreau să folosesc doar importuri non-relative (deci fără /, ./, ../). Am întâlnit această problemă în trecut și am recurs întotdeauna la folosirea importurilor relative, dar nu vreau să continui să fac asta.
În fișierul index.ts de nivel superior există import { helloWorld } from 'hello'.
tsc compilează cu succes și directorul de ieșire dist arată astfel:
main
├─ src
├─ tsconfig.json
├─ package.json
└─ dist
├─ index.js
└─ hello
└── index.js
Rularea node dist/index.js generează eroarea Error: Cannot find module 'hello'. Instrucțiunea import este compilată în dist/index.js ca require("hello"), și acolo este unde apare eroarea.
Din acest răspuns, se pare că require() va căuta modulele doar în directorul curent dacă calea începe cu ./. Așa că atunci când îl schimb la require("./hello") funcționează perfect!
Am tot experimentat cu baseUrl și paths în tsconfig.json, dar nu reușesc să obțin output-ul require("./hello"). Aș aprecia foarte mult ajutorul cu această problemă și să reușesc în sfârșit să ajung la capătul ei, mulțumesc!
// tsconfig.json
{
"compilerOptions": {
// from extending off "@tsconfig/node16/tsconfig.json"
"lib": ["es2021"],
"module": "commonjs",
"target": "es2021",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
// end of @tsconfig/node16/tsconfig.json
"baseUrl": "src",
"outDir": "dist"
},
"include": ["src"],
"exclude": ["node_modules"]
}
Răspuns #1
Am descoperit că acest subiect a primit multă atenție în problemele de pe Github ale Typescript. Câteva dintre numeroasele probleme ridicate despre această problemă:
- https://github.com/microsoft/TypeScript/issues/26722
- https://github.com/microsoft/TypeScript/issues/10866
De la liderul TS însuși:
Opinia noastră generală despre acest lucru este că ar trebui să scrieți calea de import care funcționează la runtime și să setați flag-urile TS pentru a satisface pasul de rezoluție a modulelor al compilatorului, mai degrabă decât să scrieți importul care funcționează direct în TS și apoi să încercați să faceți ca alt pas să „corecteze” căile la ceea ce funcționează la runtime.
Așadar, se pare că fie folosim importuri relative, fie folosim un instrument precum tsc-alias.