Node+TypeScript中Chalk与Boxen模块导入错误求助
解决Node + TypeScript中ESM模块加载冲突问题
问题根源
boxen和chalk的最新版本是纯ESM模块,无法通过CommonJS的require()加载。你最初用module: commonjs编译TypeScript,生成的代码尝试用require()加载这些ESM模块,直接触发ERR_REQUIRE_ESM错误;后续切换ESM配置时,缺少关键的模块解析规则导致找不到包。
解决方案:切换项目为ESM格式
以下是一步到位的配置修改:
1. 更新package.json
添加"type": "module"告诉Node.js当前项目采用ESM模块规范,同时补充编译/启动脚本:
{ "name": "module-test", "version": "1.0.0", "description": "", "main": "index.js", "type": "module", "scripts": { "build": "tsc", "start": "node dist/index.js" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "@types/boxen": "^3.0.1", "@types/chalk": "^2.2.0", "@types/node": "^18.15.0", "typescript": "^5.0.0" } }
2. 修正tsconfig.json
配置TypeScript输出ESM模块,并启用Node.js风格的模块解析,解决找不到包的问题:
{ "compilerOptions": { "target": "ES2020", "module": "ESNext", "moduleResolution": "node", "esModuleInterop": true, "strict": true, "skipLibCheck": true, "outDir": "./dist" }, "include": ["index.ts"], "exclude": ["node_modules"] }
3. 还原TypeScript代码的静态import
不用再用动态import(),ESM支持直接静态导入:
#!/usr/bin/env node import fs from 'fs'; import path from 'path'; import boxen from 'boxen'; import chalk from 'chalk'; const inputFile = path.join(process.cwd(), 'package.json'); const outputFile = path.join(process.cwd(), 'version.text'); console.log(boxen('This is a box', { padding: 1 })); console.log(chalk.red('This is red')); try { const rawData = fs.readFileSync(inputFile, 'utf8'); const packageDotJSON = JSON.parse(rawData); const buildVersion = packageDotJSON.version; fs.writeFileSync(outputFile, buildVersion, 'utf8'); console.log('File written successfully'); } catch (err) { console.error(err); }
4. 编译并运行
执行以下命令:
npm run build npm start
备选方案:使用兼容CommonJS的旧版本
如果不想切换ESM,可以安装boxen和chalk的旧版本(同时支持CommonJS和ESM):
npm uninstall boxen chalk npm install boxen@4 chalk@4
之后保持最初的module: commonjs配置即可正常运行,但不推荐长期使用旧版本,可能存在安全隐患。
内容的提问来源于stack exchange,提问作者johnwargo
相关产品推荐
相关产品推荐

