如何修改definitions的tsconfig解决ERR_REQUIRE_ESM错误?
解决Monorepo中definitions包导致的ERR_REQUIRE_ESM错误
场景概述
采用Monorepo架构,将类型/定义文件放在独立的definitions包中供前端、后端共享,目录结构如下:
. ├── frontend ├── backend/ │ └── indexes/ │ └── create-indexes.ts ├── tsconfig.json └── definitions/ ├── index.ts └── tsconfig.json
当前配置
definitions包的tsconfig
{ "compilerOptions": { "module": "commonJs", "lib": ["es6"], "noImplicitAny": true, "noImplicitThis": true, "strictNullChecks": true, "strictFunctionTypes": true, "baseUrl": "../", "types": [], "noEmit": true, "forceConsistentCasingInFileNames": true }, "files": ["index.ts"] }
后端的tsconfig
{ "compilerOptions": { "preserveConstEnums": true, "strictNullChecks": true, "sourceMap": true, "allowJs": true, "target": "es2017", "outDir": ".build", "moduleResolution": "node", "lib": ["es2020"], "rootDir": "./", "allowSyntheticDefaultImports": true, "module": "commonjs", "esModuleInterop": true } }
问题描述
运行backend/indexes/create-indexes.ts脚本时触发ERR_REQUIRE_ESM错误,提示Utils和Telegram文件使用了require语法,但实际代码中均采用ES模块的import语法:
import { 2 } from 'definitions'; import * as xyz from 'definitions'; import { 1, 2 } from 'definitions';
要求仅修改definitions包的tsconfig解决问题,后端配置保持不变。
解决方案
修改definitions包的tsconfig,调整以下关键配置:
- 移除
noEmit: true,需要生成符合CommonJS规范的输出文件供后端识别 - 添加
declaration: true,生成类型声明文件,不影响其他包的类型提示 - 设置
outDir指定输出目录(比如./dist),避免源码和编译文件混放 - 调整
baseUrl为当前目录(./),避免路径解析混乱 - 可选添加
declarationDir指定类型声明输出目录,保持结构清晰
修改后的definitions/tsconfig.json如下:
{ "compilerOptions": { "module": "commonjs", "lib": ["es6"], "noImplicitAny": true, "noImplicitThis": true, "strictNullChecks": true, "strictFunctionTypes": true, "baseUrl": "./", "types": [], "forceConsistentCasingInFileNames": true, "declaration": true, "outDir": "./dist", "declarationDir": "./dist" }, "files": ["index.ts"] }
补充操作
修改后在definitions包根目录执行tsc编译,生成dist目录下的CommonJS模块文件和类型声明。同时建议在definitions/package.json中设置:
{ "main": "dist/index.js", "types": "dist/index.d.ts" }
这样后端导入definitions时无需修改路径,直接识别编译后的文件。
内容的提问来源于stack exchange,提问作者Amr Shawki
相关产品推荐
相关产品推荐

