如何在ESM模式下本地运行带路径别名的Next.js任务?
解决ESM模式下Next.js项目脚本的路径别名问题
核心问题分析
你的tsconfig.json中paths配置与baseUrl存在冲突,加上ts-node/tsx在ESM模式下对路径别名的处理需要特殊配置,导致无法找到@/server模块。而Next.js的next dev自带bundler,会自动解析paths配置,因此能正常运行。
具体修复步骤
1. 修正tsconfig的paths映射
你的baseUrl已设为./src,意味着所有相对路径都会从src目录开始查找。原来的paths配置将@/*指向src/*,会导致实际路径变成src/src/*,这是错误的。修改如下:
{ "compilerOptions": { // ... 其他配置保留不变 "paths": { "@/*": ["*"] // 改为映射到baseUrl目录下的所有文件 }, } }
2. 调整ts-node的ESM路径解析配置
tsconfig-paths/register是CommonJS环境的注册器,在ESM模式下需改用ESM版本的注册器:
- 方式一:修改
tsconfig.json里的ts-node配置:
"ts-node": { "esm": true, "experimentalSpecifierResolution": "node", "require": ["tsconfig-paths/esm/register"] // 替换为ESM版本注册器 }
- 方式二:直接在运行命令中指定:
npx ts-node -r tsconfig-paths/esm/register -T src/server/jobs/index.ts
3. 解决tsx的静默失败问题
tsx需要显式加载ESM版本的路径解析器,运行命令改为:
npx tsx --loader tsconfig-paths/esm/register src/server/jobs/index.ts
也可以在package.json中添加便捷脚本:
"scripts": { "run:summary-job": "tsx --loader tsconfig-paths/esm/register src/server/jobs/index.ts" }
4. 确保ESM模式配置正确
检查package.json是否添加以下配置,保证Node.js按ESM模式处理文件:
"type": "module"
内容的提问来源于stack exchange,提问作者Garrett
相关产品推荐
相关产品推荐

