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的registerAPI。 - 确保你的
tsconfig.json中配置了"module": "ESNext"或其他ESM兼容的模块类型,否则可能仍会出现加载错误。
内容的提问来源于stack exchange,提问作者Filip Dupanović
相关产品推荐
相关产品推荐

