编译后找不到打字稿模块错误

时间:2020-06-22 00:02:06

标签: typescript

这使我发疯。如何获取打字稿以正确编译导入的模块?我的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';

2 个答案:

答案 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)

  1. 在tsconfig.json中,您具有“模块”:“ es2020”。这意味着打字稿将编译您的代码以使用ES模块。要使用ES模块运行nodejs,您需要v12的nodejs并使用--experimental-modules标志运行它,或者使nodejs版本13.2.0+可以不使用--experimental-modules标志运行。
  2. 如果无法使用新版本的nodejs,则需要将"module": "es2020"更改为"module": "CommonJS"