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

Node.js中如何在应用代码运行时注册ESM loader加载TS文件?

ESM脚本无需启动参数加载TS模块的解决办法

两种可行方案

方案一:手动初始化ts-node的ESM支持

直接在你的ESM脚本开头加入以下代码,完成ts-node的注册后就能正常导入TS文件:

import { register } from 'ts-node';

// 开启ESM模式注册ts-node
register({ esm: true });

// 现在可以直接导入TS模块
import './typescript-module.ts';

如果你的TS项目有自定义编译配置,比如特定的compilerOptions,可以在register参数中补充:

register({
  esm: true,
  compilerOptions: {
    target: 'ES2020',
    module: 'ESNext'
  }
});

方案二:子进程重启注入加载器

如果完全无法修改启动命令,可通过子进程重新启动当前脚本,自动注入ts-node/esm加载器:

import { spawnSync } from 'child_process';
import { fileURLToPath } from 'url';

const currentScriptPath = fileURLToPath(import.meta.url);

// 重启脚本并注入加载器,继承当前环境变量与控制台输出
spawnSync(process.execPath, ['--loader', 'ts-node/esm', currentScriptPath], {
  stdio: 'inherit',
  env: { ...process.env, TS_NODE_ESM: 'true' }
});

// 退出原进程,避免重复执行逻辑
process.exit();

该方案会重启一次进程,但能绕开启动命令无法修改的限制。

注意事项

  • ESM与CJS的加载机制不同,无法像CJS那样通过require('ts-node/register')直接注册,但ts-node提供了适配ESM的register API。
  • 确保你的tsconfig.json中配置了"module": "ESNext"或其他ESM兼容的模块类型,否则可能仍会出现加载错误。

内容的提问来源于stack exchange,提问作者Filip Dupanović

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:02:35