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

如何从Node.js ESM模块中执行ts-node命令?

解决ESM库中通过exec执行ts-node的路径问题

方案一:用npm exec调用ts-node(推荐)

npm exec会自动处理项目的node_modules/.bin路径映射,完全和npm脚本的语义一致,不需要手动拼接路径或修改环境变量。它能自动找到当前依赖树中正确的ts-node可执行文件——不管你的库是作为顶层依赖还是嵌套依赖安装。

示例代码:

import { exec } from 'child_process';

// 用npm exec调用ts-node,--用来分隔npm参数和ts-node的目标脚本
exec('npm exec ts-node -- ./path/to/your-script.ts', (error, stdout, stderr) => {
  if (error) {
    console.error(`执行出错: ${error.message}`);
    return;
  }
  if (stderr) {
    console.error(`错误输出: ${stderr}`);
    return;
  }
  console.log(`执行结果: ${stdout}`);
});

这里的--是必须的,它告诉npm把后面的内容全部传递给ts-node,避免参数混淆。

方案二:手动扩展环境变量PATH

如果不想依赖npm exec,也可以手动将当前项目的node_modules/.bin目录加入到exec的环境变量PATH中。利用process.cwd()获取当前执行脚本的项目根目录(和npm脚本的工作目录一致),拼接出bin目录路径后扩展PATH:

示例代码:

import { exec } from 'child_process';
import { join } from 'path';

// 拼接当前项目的node_modules/.bin路径
const localBinPath = join(process.cwd(), 'node_modules', '.bin');
// 复制原有环境变量并扩展PATH
const execEnv = {
  ...process.env,
  PATH: `${localBinPath}:${process.env.PATH}`
};

exec('ts-node ./path/to/your-script.ts', { env: execEnv }, (error, stdout, stderr) => {
  if (error) {
    console.error(`执行出错: ${error.message}`);
    return;
  }
  if (stderr) {
    console.error(`错误输出: ${stderr}`);
    return;
  }
  console.log(`执行结果: ${stdout}`);
});

这种方式的前提是当前工作目录为项目根目录(npm脚本默认满足这一点),但如果ts-node是嵌套在你的库自身的node_modules里而非项目顶层,这种方式可能找不到可执行文件,因此方案一更稳妥。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:30:44