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

使用ts-node与ESM搭建项目遇.ts文件扩展名未知错误求助

解决ts-node+ESM项目的文件扩展名错误及相关疑问

一、解决Unknown file extension ".ts"错误

你的配置存在两个核心问题:导入路径不符合ESM规则,以及缺少ts-node适配ESM的专属配置,以下是具体修正步骤:

1. 修正导入路径

在ESM模块系统中,Node.js要求相对导入必须带完整扩展名,非相对路径会被识别为npm包。你在src/index.ts中导入同目录的helpers.ts时,错误使用了"src/helpers.js"(既非正确相对路径,扩展名也与实际文件不符),改为相对路径并使用.ts扩展名:

// src/index.ts
import { sayHi } from "./helpers.ts";
sayHi();

2. 更新tsconfig.json配置

在tsconfig中添加ts-node的ESM适配配置,让它能正确识别TypeScript文件扩展名并遵循Node.js的ESM解析规则:

{
    "compilerOptions": {
      "target": "ESNext",
      "baseUrl": ".",
      "esModuleInterop": true,
      "moduleResolution": "NodeNext",
      "module": "ESNext"
    },
    "types": ["node"],
    "ts-node": {
      "esm": true,
      "experimentalSpecifierResolution": "node"
    }
}
  • "esm": true:明确告诉ts-node以ESM模式运行
  • "experimentalSpecifierResolution": "node":让ts-node兼容Node.js的扩展名解析逻辑,避免因缺少扩展名或扩展名不符报错

3. 验证运行

保持启动脚本npx ts-node-esm src/index.ts不变,重新运行即可正常输出hi!。


二、关于ESM的合理性与搭建困难的解答

1. 新项目使用ESM完全合理

ESM是JavaScript的官方标准模块系统,相比CommonJS有以下优势:

  • 与浏览器端模块语法完全一致,便于前后端代码复用
  • 支持顶层await、静态导入导出,语法更灵活规范
  • 打包工具(如Vite、Rollup)对ESM的树摇优化更高效,能生成体积更小的产物
  • Node.js从v12开始原生支持,当前v20版本已非常稳定,生态适配度足够覆盖绝大多数开发场景

2. ts-node搭建ESM困难的原因

  • ts-node最初是为CommonJS设计的,ESM支持属于后期迭代功能,兼容性适配需要协调TypeScript编译规则与Node.js的ESM运行机制,天然存在复杂度
  • ESM与CommonJS在模块解析、扩展名要求、路径处理上差异极大,比如ESM强制要求导入带扩展名,而TypeScript默认编译时会转换扩展名,ts-node作为直接运行工具需要同时满足两者规则,容易出现配置冲突
  • 不同版本的ts-node、TypeScript、Node.js之间存在兼容性差异,部分旧文档的配置方案已过时,导致尝试的解决方案无效

内容的提问来源于stack exchange,提问作者user3896248

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:12:58