打字稿编译成功但节点找不到模块
Typescript compiles successfully but node cannot find module
即使 Typescript 编译成功,节点错误 Error: Cannot find module 'hello'
。
目录结构(注意这与tsconfig docs for baseUrl几乎相同)
main
| src
| ├─ index.ts
| └─ hello
| └── index.ts
└── tsconfig.json
└── package.json
我只想使用非相对导入(所以没有 /
、./
、../
)。我过去遇到过这个问题,并且一直求助于使用相对导入,但我不想继续这样做。
顶层 index.ts
有 import { helloWorld } from 'hello'
.
tsc
编译成功,输出目录 dist
如下所示:
main
├─ src
├─ tsconfig.json
├─ package.json
└─ dist
├─ index.js
└─ hello
└── index.js
运行 node dist/index.js
输出错误 Error: Cannot find module 'hello'
。导入语句在 dist/index.js
中编译为 require("hello")
,这是抛出错误的地方。
从 this answer 看来,如果路径以 ./
开头,require()
似乎只会查看当前目录中的模块。因此,当我将其更改为 require("./hello")
时,它完全可以正常工作!
我一直在 tsconfig.json
中使用 baseUrl
和 paths
,但我无法让它输出 require("./hello")
。真的很感激在这个问题上的一些帮助,并最终找到它的底部,谢谢!
// 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"]
}
我发现这个话题在 Typescript 的 Github 问题中受到了很多关注。关于这个问题提出的许多问题中的一些:
- https://github.com/microsoft/TypeScript/issues/26722
- https://github.com/microsoft/TypeScript/issues/10866
Our general take on this is that you should write the import path that works at runtime, and set your TS flags to satisfy the compiler's module resolution step, rather than writing the import that works out-of-the-box for TS and then trying to have some other step "fix" the paths to what works at runtime.
所以看起来我们要么使用相对导入,要么使用像 tsc-alias
.
这样的工具
即使 Typescript 编译成功,节点错误 Error: Cannot find module 'hello'
。
目录结构(注意这与tsconfig docs for baseUrl几乎相同)
main
| src
| ├─ index.ts
| └─ hello
| └── index.ts
└── tsconfig.json
└── package.json
我只想使用非相对导入(所以没有 /
、./
、../
)。我过去遇到过这个问题,并且一直求助于使用相对导入,但我不想继续这样做。
顶层 index.ts
有 import { helloWorld } from 'hello'
.
tsc
编译成功,输出目录 dist
如下所示:
main
├─ src
├─ tsconfig.json
├─ package.json
└─ dist
├─ index.js
└─ hello
└── index.js
运行 node dist/index.js
输出错误 Error: Cannot find module 'hello'
。导入语句在 dist/index.js
中编译为 require("hello")
,这是抛出错误的地方。
从 this answer 看来,如果路径以 ./
开头,require()
似乎只会查看当前目录中的模块。因此,当我将其更改为 require("./hello")
时,它完全可以正常工作!
我一直在 tsconfig.json
中使用 baseUrl
和 paths
,但我无法让它输出 require("./hello")
。真的很感激在这个问题上的一些帮助,并最终找到它的底部,谢谢!
// 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"]
}
我发现这个话题在 Typescript 的 Github 问题中受到了很多关注。关于这个问题提出的许多问题中的一些:
- https://github.com/microsoft/TypeScript/issues/26722
- https://github.com/microsoft/TypeScript/issues/10866
Our general take on this is that you should write the import path that works at runtime, and set your TS flags to satisfy the compiler's module resolution step, rather than writing the import that works out-of-the-box for TS and then trying to have some other step "fix" the paths to what works at runtime.
所以看起来我们要么使用相对导入,要么使用像 tsc-alias
.