这使我发疯。如何获取打字稿以正确编译导入的模块?我的main.ts有import { AddListeners } from './listeners';
,它也是一个带有export function AddListeners()
的.ts文件,但是当编译为main.js时,此行不会更改,并且节点会引发以下错误:
错误[ERR_MODULE_NOT_FOUND]:找不到从C:\ Users \ bugbe \ Documents \ VSCode \ tricorder \ dist \ main.js导入的模块'C:\ Users \ bugbe \ Documents \ VSCode \ tricorder \ dist \ listeners' / p>
这是我的tsconfig.json:
{
"compilerOptions": {
"esModuleInterop": true,
"outDir": "dist",
"module": "es2020",
"moduleResolution": "node",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"target": "es2020",
"typeRoots": [
"node_modules/@types"
],
"baseUrl": "./",
"paths": {
"*":[
"node_modules/"
]
}
}
}
因此导入模块的代码无法正确编译,因为要正常工作,其外观应类似于import { AddListeners } from './listeners.js';
答案 0 :(得分:2)
我在使用 Node 15 将 TS 编译为 ES 模块时遇到了这个问题。结果证明 TS 在编译模块时不会自动将“.js”扩展名添加到您的导入路径中,但是 ES 路径解析算法需要扩展名出席。
对我来说,就像使用 --es-module-specifier-resolution=node
标志让 Node 使用旧的 require()
解析行为一样简单:
node --es-module-specifier-resolution=node ./dist/src/main
作为参考,我的设置如下:
package.json
{
...
"type": "module"
}
tsconfig.json
{
"include": ["src/**/*", "package.json"],
"compilerOptions": {
"composite": true,
"declaration": true,
"declarationMap": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"importHelpers": true,
"module": "ESNext",
"moduleResolution": "node",
"newLine": "LF",
"noFallthroughCasesInSwitch": true,
"noImplicitReturns": true,
"noUncheckedIndexedAccess": true,
"noUnusedLocals": false,
"noUnusedParameters": false,
"preserveConstEnums": true,
"removeComments": true,
"resolveJsonModule": true,
"strict": true,
"target": "ES2018"
}
}
答案 1 :(得分:0)
--experimental-modules
标志运行它,或者使nodejs版本13.2.0+可以不使用--experimental-modules
标志运行。"module": "es2020"
更改为"module": "CommonJS"
。