【问题标题】:TypeScript 4.5: Module not found importing local fileTypeScript 4.5:找不到导入本地文件的模块
【发布时间】:2022-02-07 11:50:23
【问题描述】:

我有一个基于 node express 的应用程序,带有以下 tsconfig:

{
  "compilerOptions": {
    "lib": [ "es6", "es2021", "esnext" ],
    "target": "esnext",
    "module": "es2022",
    "composite": true,
    "declaration": true,
    "declarationMap": true,
    "forceConsistentCasingInFileNames": true,
    "importHelpers": true,
    "newLine": "LF",
    "noFallthroughCasesInSwitch": true,
    "noImplicitReturns": true,
    "noUncheckedIndexedAccess": true,
    "noUnusedLocals": false,
    "noUnusedParameters": false,
    "preserveConstEnums": true,
    "removeComments": true,
    "resolveJsonModule": true,
    "esModuleInterop": true,
    "noImplicitAny": true,
    "moduleResolution": "Node",
    "sourceMap": false,
    "rootDir": "./src",
    "outDir": "./dist",
    "baseUrl": "./src",
    "paths": {
      "*": [
        "node_modules/*"
    ]
}

}, }

注意:将我的模块切换到 commonjs 不是一个灵魂,我希望它被构建为一个模块

我在索引文件中的第一个本地文件导入时遇到错误,但它说它找不到的文件(找不到模块)确实存在,它有一个默认导出并且构建输出确实有一个 . d.ts 文件旁边还有一个类型导出。

我不知道为什么它不起作用。

错误:

Cannot find module 'workspace\dist\config\csrf' imported from workspace\dist\index.js

注意:我用工作区占位符替换了绝对路径。在这种情况下,我有一个文件:src/config/csrf.ts,它正在构建/转换为 dist/config/csrf.js,这一切似乎都在检查中,但它没有导入。

鉴于这是入口文件中的第一个本地文件导入,我假设所有其他文件都会遇到同样的问题。

发生了什么,在构建模块时我应该如何解析本地文件?

我的出口是这样的:

const csrf = () => {
    // Code ommitted
}
export default csrf;

使用节点 ^16.13.2 和 TypeScript 4.5.6

编辑:我设置了以下脚本

  "scripts": {
    "clean": "rm -rf dist/",
    "lint": "tslint -c tslint.json -p tsconfig.json --fix",
    "tsc": "tsc",
    "build": "npm run clean && npm run lint && npm run tsc",
    "build:light": "npm run tsc",
    "migrate:dev": "npx prisma migrate dev",
    "migrate:prod": "npm run migrate:prod && npm run prisma:generate",
    "dev:start": "npm run build && npm run start",
    "dev:light": "npm run build:light && npm run start",
    "dev": "nodemon --watch src -e ts,ejs --exec npm run dev:start",
    "light": "nodemon --watch src -e ts,ejs --exec npm run dev:light",
    "start": "node -r dotenv/config .",
    "test": "echo \"Error: no test specified\" && exit 1"

},

并且在使用npm run devnpm run light时出现错误。

请注意,TypeScript 编译正常,实际构建的 JavaScript 通过节点运行时会发生此错误。

编辑:我发现,如果我手动更新构建的 JavaScript 导入,它可以工作

例如:

import csrf from "./config/csrf";

更新到:

import csrf from "./config/csrf.js"

它突然起作用了,

什么鬼?我不应该手动更新我所有的转译文件,对吧?将 TypeScript 导入转换为兼容的 JavaScript 导入的正确方法是什么?

这看起来非常复杂且不必要。我错过了什么?在 TypeScript 中的导入上使用“.js”是零意义的,这样构建的输出才会真正运行

【问题讨论】:

    标签: node.js typescript node-modules


    【解决方案1】:

    github 上的 got 包非常方便 /nifty guide 用于从 commonjs 转换为 ESM,适用于 js 和 TypeScript:

    据此,您确实需要将 .js 扩展名添加到 TypeScript 文件的导入中,所以我已经这样做了。它正在工作,我遇到了一个不同的问题,这将引发一个新问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-30
      • 2018-04-23
      • 2023-04-02
      • 2019-11-30
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      相关资源
      最近更新 更多