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

使用ts-node导入'./hi'触发ERR_MODULE_NOT_FOUND错误的解决方法

解决ts-node无法识别合法TypeScript导入的问题

问题场景

运行以下命令时出现模块找不到错误:

git clone https://github.com/Ser5/ts-node-nohi
cd ts-node-nohi
npm i
npx ts-node main.ts

错误信息:

G:\Programming\JS\ts-node-nohi\node_modules\ts-node\dist-raw\node-internal-modules-esm-resolve.js:366
    throw new ERR_MODULE_NOT_FOUND(
          ^
CustomError: Cannot find module 'G:\Programming\JS\ts-node-nohi\hi' imported from G:\Programming\JS\ts-node-nohi\main.ts
    at finalizeResolution (G:\Programming\JS\ts-node-nohi\node_modules\ts-node\dist-raw\node-internal-modules-esm-resolve.js:366:11)
    at moduleResolve (G:\Programming\JS\ts-node-nohi\node_modules\ts-node\dist-raw\node-internal-modules-esm-resolve.js:801:10)
    at Object.defaultResolve (G:\Programming\JS\ts-node-nohi\node_modules\ts-node\dist-raw\node-internal-modules-esm-resolve.js:912:11)
    at G:\Programming\JS\ts-node-nohi\node_modules\ts-node\src\esm.ts:218:35
    at entrypointFallback (G:\Programming\JS\ts-node-nohi\node_modules\ts-node\src\esm.ts:168:34)
    at G:\Programming\JS\ts-node-nohi\node_modules\ts-node\src\esm.ts:217:14
    at addShortCircuitFlag (G:\Programming\JS\ts-node-nohi\node_modules\ts-node\src\esm.ts:409:21)
    at resolve (G:\Programming\JS\ts-node-nohi\node_modules\ts-node\src\esm.ts:197:12)
    at resolve (G:\Programming\JS\ts-node-nohi\node_modules\ts-node\src\child\child-loader.ts:15:39)
    at nextResolve (node:internal/modules/esm/loader:173:28)

但通过tsc编译后再用node运行却能正常工作:

tsc --outDir ../ts-node-yeshi/ main.ts && cd ../ts-node-yeshi/ && node main.js

核心原因

tsc与ts-node的模块解析逻辑存在差异:

  • tsc编译时会自动补全导入路径的扩展名(比如把./hi补为./hi.js),对TypeScript文件的导入做特殊兼容处理;
  • ts-node处理ES模块时,严格遵循Node.js的ES模块解析规则,要求导入必须指定完整文件扩展名,或通过配置让解析器识别无扩展名的路径。

解决方案

方案1:导入时添加完整文件扩展名

直接修改main.ts中的导入语句,补上.ts扩展名:

// 原导入
import { hi } from './hi';
// 修改后
import { hi } from './hi.ts';

这种方式最简单直接,完全符合Node.js ES模块规范,ts-node可直接识别。

方案2:配置ts-node与TypeScript路径解析

若不想修改导入语句,可通过配置让ts-node支持无扩展名导入:

  1. 在package.json中添加"type": "module",明确项目使用ES模块;
  2. 修改tsconfig.json的编译选项,启用Node.js兼容的模块解析规则:
{
  "compilerOptions": {
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    "baseUrl": ".",
    "paths": {
      "*": ["*.ts"]
    }
  },
  "include": ["**/*.ts"]
}
  1. 安装tsconfig-paths依赖:
npm install tsconfig-paths --save-dev
  1. 运行时通过tsconfig-paths注册路径映射:
npx ts-node -r tsconfig-paths/register main.ts

方案3:切换为CommonJS模块规范

若项目无需使用ES模块,可改用CommonJS:

  1. 删除package.json中的"type": "module";
  2. 修改tsconfig.json的编译选项:
{
  "compilerOptions": {
    "module": "CommonJS",
    "moduleResolution": "Node"
  }
}

此时ts-node会使用CommonJS解析规则,允许省略文件扩展名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 16:45:40