You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,按照以下方式导入模块:

  1. 静态导入:单独一行输入,使用.js扩展名(Node16 ESM模式要求,ts-node会自动映射到对应.ts文件)
import sql from './src/db.js';
  1. 动态导入:使用.js扩展名,直接通过顶层await导入(Node18+ REPL支持顶层await)
const foo = await import('./src/foo.js');

三、替代方案:使用tsx REPL

如果ts-node的ESM REPL仍存在兼容问题,推荐使用tsx工具,它对ESM的REPL支持更完善:

  1. 安装tsx:
npm install -D tsx
  1. 启动REPL:
tsx
  1. 直接导入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 22:35:44