typescript 使用import from 方式引入自建对象时报错模块未找到,且已设置moduleResolution为node?

作者站长头像
站长
· 阅读数 10

Nodejs项目使用import {a,c} from "./xxx/xxx" 方式导入的时候出现异常,必须要附带后缀名".ts"或者".js"才行,如"import {a,c} from "./xxx/xxx.js":

node:internal/process/esm_loader:40
      internalBinding('errors').triggerUncaughtException(
                                ^
Error: Cannot find module 'C:\Users\admin\WebstormProjects\untitled\src\bot\events' imported from C:\Users\admin\WebstormProjects\untitled\index.ts

其中index和events都是ts对象,从报错中看貌似没有去寻找events.ts文件

Node.js V20.9.0ts-node V10.9.1

我已经完成了tsconfig.json的配置,而且删除了babel之类的相关依赖,依然无法解决问题

  "compilerOptions": {
    "outDir": "dist",
    "types": [
      "node",
      "jest"
    ],
    "moduleResolution": "node",
    "module": "ESNext",
    "target": "ESNext"
  }

如果说我带上了".ts"后缀,IDE会提示我:An import path can only end with a  .ts  extension when  allowImportingTsExtensions  is enabled;typescript 使用import from 方式引入自建对象时报错模块未找到,且已设置moduleResolution为node?

typescript 使用import from 方式引入自建对象时报错模块未找到,且已设置moduleResolution为node?

typescript 使用import from 方式引入自建对象时报错模块未找到,且已设置moduleResolution为node?如果说我带上了".js"后缀,那么可以正常运行,但是在IDE的自动补全导入代码的时候并不会主动给我带上".js"后缀,很不方便,所以我想知道为什么我这里不能在没有后缀的时候引入依赖对象

回复
1个回答
avatar
test
2024-06-24

在搜索了无数的资料后得到答案,因为我使用的typescript版本比较高,新版本的ts特性会要求使用相对路径导入的时候带上文件扩展名以提升性能

举例来说,NodeJs 中的 ESM 强制要求你的相对导入路径携带扩展名,即 import ns from "./mod.mjs"(你也可以使用 --experimental-specifier-resolution=node 配置来启用自动地路径解析),这主要是为了贴合 NodeJs 在服务器环境下的性能表现。然而大部分的构建工具其实不要求你这么做,它会融合 ESM 与 CJS 的模块解析策略。

所以,只需要在package.json中带上“--experimental-specifier-resolution=node”指令即可如:

cross-env NODE_OPTIONS="--no-warnings --loader=ts-node/esm --experimental-specifier-resolution=node " node index.ts

参考:TS 5.0 新特性

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容