typescript 使用import from 方式引入自建对象时报错模块未找到,且已设置moduleResolution为node?
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;
如果说我带上了".js"后缀,那么可以正常运行,但是在IDE的自动补全导入代码的时候并不会主动给我带上".js"后缀,很不方便,所以我想知道为什么我这里不能在没有后缀的时候引入依赖对象
回复
1个回答
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 新特性
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容