【问题标题】:Typescript module not found error after compilation编译后找不到打字稿模块错误
【发布时间】: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”

这是我的 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';

【问题讨论】:

  • listeners.js 似乎是一个javascript(不是打字稿)文件。这是正确的吗?
  • 我有 main.ts 和 listeners.ts 并且输出文件夹包含它们各自的 .js 文件。
  • 仅供参考:删除node_modules 文件夹并运行 npm install 可以在遇到此问题时解决此问题

标签: typescript


【解决方案1】:

我在使用 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"
    }
}

【讨论】:

    【解决方案2】:
    1. 在您的 tsconfig.json 中有“模块”:“es2020”。这意味着 typescript 将编译您的代码以使用 ES 模块。要使用 ES 模块运行 nodejs,您需要 v12 的 nodejs 并使用 --experimental-modules 标志运行它,或者使用 nodejs 版本 13.2.0+ 以在不使用 --experimental-modules 标志的情况下运行。
    2. 如果您无法使用较新版本的 nodejs,您需要将 "module": "es2020" 更改为 "module": "CommonJS"

    【讨论】:

      【解决方案3】:

      您应该使用标志--es-module-specifier-resolution=node 运行带有节点的程序,因为您使用的是 es6+ 模块类型。如果你使用 CommonJS,你就不会遇到这个问题。

      【讨论】:

        猜你喜欢
        • 2016-05-08
        • 2018-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-21
        • 2014-11-21
        • 1970-01-01
        • 2017-11-05
        相关资源
        最近更新 更多