如何在REPL中交互式导入TypeScript ESM模块?
解决ts-node ESM REPL中导入本地TS模块的问题
针对你遇到的ts-node REPL无法导入本地ESM模块的问题,可通过调整配置或更换工具来解决,以下是具体方案:
一、调整tsconfig.json配置
修改ts-node部分的配置,适配REPL的ESM解析需求:
{ "include": [ "src" ], "exclude": [ "node_modules", "dist" ], "ts-node": { "transpileOnly": true, "esm": true, "specifierResolution": "node", // 替换原实验版本的配置 "files": true // 确保ts-node识别项目内的模块文件 }, "compilerOptions": { "lib": ["es2023"], "module": "Node16", "target": "es2022", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "moduleResolution": "nodenext" } }
二、REPL中正确的导入方式
配置修改后,启动ts-node REPL,按照以下方式导入模块:
- 静态导入:单独一行输入,使用
.js扩展名(Node16 ESM模式要求,ts-node会自动映射到对应.ts文件)
import sql from './src/db.js';
- 动态导入:使用
.js扩展名,直接通过顶层await导入(Node18+ REPL支持顶层await)
const foo = await import('./src/foo.js');
三、替代方案:使用tsx REPL
如果ts-node的ESM REPL仍存在兼容问题,推荐使用tsx工具,它对ESM的REPL支持更完善:
- 安装tsx:
npm install -D tsx
- 启动REPL:
tsx
- 直接导入TS模块(支持带
.ts扩展名或省略扩展名):
// 静态导入 import sql from './src/db.ts'; // 动态导入 const foo = await import('./src/foo');
报错原因说明
- 带
.ts扩展名报错:Node原生ESM加载器不识别.ts后缀,ts-node在REPL中转译逻辑未正确处理该场景,导致出现语法错误。 - 不带扩展名报错:Node16/nodenext模块解析模式下,ESM必须指定文件扩展名,而ts-node REPL的动态导入回调未正确配置,无法解析无扩展名的模块路径。
内容的提问来源于stack exchange,提问作者VanillaDonuts
相关产品推荐
相关产品推荐

