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

在CommonJS架构的NextJS+TS项目中添加独立工具脚本的问题

解决方法

下面是几个无需修改全局tsconfig.json和项目根目录package.json的可行方案:

方案1:给工具脚本单独配置TypeScript编译规则

在tools目录下创建专属的tsconfig.tools.json,继承全局配置的同时覆盖模块相关选项,完全不影响主项目:

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "module": "CommonJS", // 适配Node.js默认的CommonJS模块系统
    "noEmit": false, // 允许ts-node编译输出(全局配置为noEmit: true)
    "target": "ES6" // 匹配Node.js支持的版本,避免语法兼容问题
  },
  "include": ["./*.ts"]
}

运行脚本时指定这个配置文件:

ts-node --project tools/tsconfig.tools.json tools/cleanup.ts

脚本里可正常使用import语法(全局配置已开启esModuleInterop),示例代码:

import * as fs from 'fs';
import path from 'path';

// 示例清理逻辑:删除项目根目录下的.temp文件夹
fs.rmSync(path.join(process.cwd(), '.temp'), { recursive: true, force: true });

方案2:用ts-node参数强制指定模块模式

无需额外配置文件,直接通过命令行参数覆盖模块规则:

  • 若想继续使用ES模块语法(import),运行时添加--esm参数:
ts-node --esm tools/cleanup.ts

注意:此时脚本导入需符合ES模块规范,比如import fs from 'fs/promises';(Node.js 14+支持)。

  • 若想切换到CommonJS模式(兼容require或import),添加--cjs参数:
ts-node --cjs tools/cleanup.ts

这种模式下,脚本里用const fs = require('fs');或import * as fs from 'fs';均可正常运行。

方案3:修改脚本文件后缀

通过后缀名明确告诉Node.js和ts-node脚本的模块类型:

  • 改为cleanup.cts(CommonJS类型的TypeScript文件):
    脚本支持require或import语法,直接运行:
    ts-node tools/cleanup.cts
    
  • 改为cleanup.mts(ES模块类型的TypeScript文件):
    脚本使用ES模块的import语法,运行时需加--esm参数:
    ts-node --esm tools/cleanup.mts
    

原报错原因说明

你的全局tsconfig.json中module设为esnext、noEmit设为true:

  • module: esnext会让ts-node生成ES模块代码,但Node.js默认以CommonJS模式加载文件,导致模块语法冲突;
  • noEmit: true禁止ts-node编译输出,进一步加剧加载错误。
    上述方案均通过局部配置或命令行参数,单独为工具脚本调整模块规则,不会影响主项目的编译配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 15:35:27