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.0 ts-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; ![image.png](https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241116/789b45bf08a55b701d23dff14b969f44.png) ![image.png](https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241116/2055fb4edd784c6899b9c8cb697f0b5d.png) ![image.png](https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241116/fd286a95d1515c54565b1d67143a9e32.png) 如果说我带上了".js"后缀,那么可以正常运行,但是在IDE的自动补全导入代码的时候并不会主动给我带上".js"后缀,很不方便,所以我想知道为什么我这里不能在没有后缀的时候引入依赖对象

阅读量:16

点赞量:0

问AI
在搜索了无数的资料后得到答案,因为我使用的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 新特性" (https://link.segmentfault.com/?enc=ohAroOLxecSxkCq32eZ8Zw%3D%3D.EA89fJRtQuPkt3fxSqTnu3aKcOqeQ3gJWbSllRBLTnEwyek1elfDTxzhugtKIi%2BX)