在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
相关产品推荐
相关产品推荐

