使用ts-node运行导入文件的脚本时遭遇ERR_MODULE_NOT_FOUND错误求助
解决Monorepo中ts-node运行ESM脚本的模块找不到问题
核心问题分析
你遇到的ERR_MODULE_NOT_FOUND和unknown file type .ts错误,本质是ESM模式下ts-node的模块解析规则与TypeScript paths别名、Monorepo包导入的兼容性问题:
- tsconfig-paths的CommonJS注册器
tsconfig-paths/register在ESM模式下不生效 - Node.js的ESM模块解析要求必须指定文件扩展名,而TypeScript默认配置未适配
- Monorepo内部包的导入需要ts-node正确识别workspace链接的包
分步修复方案
1. 修正ts-node的ESM配置(关键)
修改@company/db/tsconfig.json中的ts-node配置,替换为ESM兼容的loader,并启用Node.js风格的模块解析:
{ "extends": "../../tsconfig.base.json", "compilerOptions": { "baseUrl": ".", "paths": { "@company/db/*": ["src/*"] }, "allowImportingTsExtensions": true, // 允许直接导入.ts文件(适配ESM扩展名要求) "moduleResolution": "nodenext" // 适配ESM/CJS混合解析逻辑 }, "include": ["index.ts", "src/**/*", "scripts/**/*"], "ts-node": { "esm": true, "experimentalSpecifierResolution": "node", // 允许省略扩展名,匹配Node.js原生行为 "loader": "tsconfig-paths/esm-loader" // ESM模式下的paths别名解析器 } }
2. 调整package.json的运行脚本
明确指定tsconfig文件路径,确保ts-node读取正确的配置:
{ "scripts": { "seed": "pnpm with-env ts-node --project ./tsconfig.json ./scripts/seed.ts" } }
3. 修复脚本中的导入路径
优先使用TypeScript别名(更适配Monorepo),或确保相对路径带有扩展名:
// 推荐:使用别名 import { db, connectDB } from "@company/db/db"; import { employees } from "@company/db/schemas"; // 备选:相对路径加扩展名 import { db, connectDB } from "../src/db.ts"; import { employees } from "../src/schemas.ts";
4. 适配Monorepo内部包导入
如果@company/db依赖其他Monorepo包(如@company/utils),需在tsconfig.json的paths中添加对应别名,确保ts-node能解析:
"paths": { "@company/db/*": ["src/*"], "@company/utils/*": ["../utils/src/*"] // 根据你的Monorepo结构调整路径 }
替代方案:用tsx替代ts-node
如果上述配置仍有问题,推荐使用tsx(基于esbuild,对ESM和Monorepo支持更友好,无需复杂配置):
- 安装依赖:
pnpm add -D tsx - 修改脚本:
{ "scripts": { "seed": "pnpm with-env tsx ./scripts/seed.ts" } }
tsx会自动读取tsconfig、处理paths别名和ESM模块,无需额外配置。
内容的提问来源于stack exchange,提问作者Nikola-Milovic
相关产品推荐
相关产品推荐

