最权威的解决方案如下:【pm2运行ts的终极解决方案】使用pm2+ tsx 运行 TypeScript 文件指南-优快云博客
GPT最开始推荐的方案是:
pm2 start xx.ts --interpreter ts-node-esm
但是使用你用的是 --interpreter ts-node-esm 但仍然报
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts"
可能的解决方案【不一定可以】:
pm2 start xx.ts --name xx --interpreter node --node-args "--loader ts-node/esm"
✅ 这个绝对能跑,彻底绕过 PM2 不识别 .ts 的问题。
✅ 解释:
--interpreter node: 让 PM2 使用原生 node 启动(绕过 bug)
--node-args "--loader ts-node/esm": 指定用 ts-node 的 ESM 加载器处理 .ts 文件
✅ 这个方式是 TypeScript 官方和 ts-node 推荐的在 ESM 模式下的启动方法。
📄 等价配置(ecosystem.config.js 推荐)
module.exports = {
apps: [
{
name: 'xx',
script: 'xx.ts',
interpreter: 'node',
node_args: '--loader ts-node/esm',
cwd: '/root/docker-root/myProject',
watch: false
}
]
};
pm2 start ecosystem.config.js
警告提示:
(node:10350) ExperimentalWarning: --experimental-loader may be removed in the future; instead use register():
--import 'data:text/javascript,import { register } from "node:module"; import { pathToFileURL } from "node:url"; register("ts-node/esm", pathToFileURL("./"));'
(Use node --trace-warnings ... to show where the warning was created)
是 Node.js 对 --loader 的一个“实验功能警告”,并不是报错,也不会影响运行。
✅ 方法 2:忽略这个 warning(推荐)
这才是目前主流做法,继续使用 --loader ts-node/esm 即可
你可以放心用它,等将来 Node 正式改变方式,再统一升级。