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

JavaScript转TypeScript后Node运行报错及ts-node启动问题咨询

TypeScript转译与运行问题解答

问题场景

将JavaScript项目迁移至TypeScript后,遇到两个核心问题:

  1. npx tsc编译无报错,但执行node dist/init.js时触发模块找不到错误,手动为导入路径添加.js后缀后可正常运行。
  2. 使用ts-node启动项目时,出现ES模块加载错误。

具体代码与现象

  • 源文件src/init.ts:
import message from './server'
console.log(message)
  • 源文件src/server.ts:
export default 'hello word'
  • 编译后dist/init.js:
import message from './server';
console.log(message);
  • 编译后dist/server.js:
export default 'hello word';
  • 执行node dist/init.js报错:

Error [ERR_MODULE_NOT_FOUND]: Cannot find module 'path/dist/server' imported from path/dist/init.js
Did you mean to import ../server.js?

  • tsconfig.json关键配置:target: "ES2022"、module: "ES2022"
  • package.json启动命令:"start": "ts-node -r ./src/init.ts",执行报错:

Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: path/src/init.ts

问题解答

1. TypeScript编译为何不自动添加.js后缀?

TypeScript的模块解析逻辑是基于源码层级设计的:编写.ts文件时,你导入的是同目录下的server.ts(或同扩展名的源文件),TS会自动匹配源文件完成类型检查。但Node.js的ES模块解析规则要求必须指定完整的文件后缀(如.js),而TS默认不会自动追加后缀——这是为了兼容多模块系统(如CommonJS),同时避免与源码文件的导入逻辑冲突。

要让TS自动生成带.js后缀的导入路径,需修改tsconfig.json:

  • 添加"moduleResolution": "NodeNext"或"Node16":让TS遵循Node.js的ES模块解析规则
  • 确保"outDir"正确指向输出目录(如"outDir": "./dist")
  • 可选配置"esModuleInterop": true,提升跨模块系统的兼容性

2. ts-node启动报错的解决方法

报错ERR_REQUIRE_ESM是因为项目配置为ES模块,但ts-node默认以CommonJS模式运行。解决步骤:

  1. 在package.json中添加"type": "module",明确项目为ES模块
  2. 保持tsconfig.json中module: "ES2022",并设置moduleResolution: "NodeNext"/Node16
  3. 修改启动命令为"start": "ts-node-esm ./src/init.ts"——ts-node-esm是ts-node专为ES模块设计的运行命令,替换原有的ts-node -r(-r是CommonJS的require钩子,不适用于ES模块)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:50:15