Node error Error: Cannot find module 'hello'
even though Typescript compiled successfully.
Dir structure (note this is almost identical to tsconfig docs for baseUrl)
main
| src
| ├─ index.ts
| └─ hello
| └── index.ts
└── tsconfig.json
└── package.json
I want to only use non-relative imports (so no /
, ./
, ../
). I've encountered this problem in the past and have always resorted to using relative imports, but I do not want to continue doing this.
In the top level index.ts
there is import { helloWorld } from 'hello'
.
tsc
compiles successfully and the output dir dist
looks like this:
main
├─ src
├─ tsconfig.json
├─ package.json
└─ dist
├─ index.js
└─ hello
└── index.js
Running node dist/index.js
outputs the error Error: Cannot find module 'hello'
. The import statement gets compiled in dist/index.js
to require("hello")
which is where the error is thrown.
From this answer, it seems like require()
will only look at modules in the current directory if the path begins with ./
. So when I change it to require("./hello")
it works completely fine!
I've been playing around with baseUrl
and paths
in tsconfig.json
but I cannot get it to output require("./hello")
. Would really appreciate some help on this issue and to finally get to the bottom of it, thanks!
// 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"]
}
I found that this is topic has received a lot of attention in Typescript's Github issues. A few of many issues raised about this very problem:
From the TS Lead himself:
So it seems like we either use relative imports, or use some tool like
tsc-alias
.