使用ts-node-esm运行TS Discord机器人时遇模块导入找不到问题
ESM模式下TS路径别名&导入报错的解决办法
先搞定相对路径的问题
连相对路径都报错的话,先排查这几个点:
- 核对文件位置:
Ping.ts在src/Commands/Miscellaneous/,往上两级是src/,../../Utils/Util这个路径对应的文件必须真的在src/Utils/Util.ts,别搞错层级,还要注意Mac/Linux系统文件名区分大小写,别写错字母 - ESM模式必须加扩展名:不管是TS还是JS文件,导入时都得写
.js后缀,比如改成../../Utils/Util.js——别纠结为什么是js,ts-node-esm会自动处理TS到JS的映射
修复路径别名的问题
TSConfig里的paths别名,ESM模式下ts-node-esm不会自动识别,得额外配置:
- 装依赖:
npm install tsconfig-paths --save-dev - 修改启动命令,用node加载器结合路径注册:
嫌麻烦就把这个命令写到node --loader ts-node/esm --require tsconfig-paths/register src/Main.tspackage.json的scripts里:"scripts": { "start": "node --loader ts-node/esm --require tsconfig-paths/register src/Main.ts" } - 确认tsconfig.json的配置没毛病:
必须有baseUrl配合paths,而且module和moduleResolution要和ESM匹配:{ "compilerOptions": { "baseUrl": "./src", "paths": { "@/Utils/*": ["Utils/*"] }, "module": "ESNext", "moduleResolution": "NodeNext", "esModuleInterop": true } }
最后提几个注意点
package.json里的type必须是module,别改回去- 所有导入语句都要加文件扩展名,别偷懒省略
- 要是还不行,删了node_modules重新装一遍,再检查别名拼写有没有错(比如@后面是不是多了或少了斜杠)
内容的提问来源于stack exchange,提问作者Ragnar Lothbrok
相关产品推荐
相关产品推荐

