使用franc与langs开发JS语言识别工具时遇ERR_REQUIRE_ESM错误
解决Error [ERR_REQUIRE_ESM]:franc和langs包的ESM兼容问题
问题原因
franc 6.x及以上版本为纯ESM模块,仅支持ES模块语法(import/export),若Node.js版本过低、package.json配置错误或存在CommonJS与ESM混合使用的场景,就会触发该错误。
可行解决方案
方案1:正确配置ESM环境(推荐)
- 匹配Node.js版本:使用Node.js 14.13.1+、16.x或更高版本(这类版本对ESM支持更稳定)。
- 验证package.json配置:确保
"type": "module"处于package.json根节点,示例配置如下:
{ "name": "language-detector", "version": "1.0.0", "type": "module", "dependencies": { "franc": "^6.2.0", "langs": "^2.0.0" } }
- 安装最新依赖:
npm install franc@latest langs@latest
- 运行脚本:直接用
node命令执行你的ES模块脚本:
node your-script-name.js
方案2:切换到CommonJS兼容版本(仅用于无法升级Node.js的场景)
若必须使用CommonJS语法(require),可降级franc到5.x版本(该版本支持CommonJS):
- 调整package.json:移除
"type": "module"配置。 - 安装兼容依赖:
npm install franc@5 langs@latest
- 修改代码为CommonJS语法:
const franc = require('franc'); const langs = require('langs'); function guessLanguage(text) { const langCode = franc(text); if (langCode === 'und') { return 'Cannot guess language'; } else { const language = langs.where('3', langCode); return language.name; } } // Example usage: const inputText = 'Bonjour tout le monde'; const guessedLanguage = guessLanguage(inputText); console.log(`The input text is in ${guessedLanguage}`);
- 运行脚本:
node your-script-name.js
额外排查点
- 检查项目中是否存在同时使用
require()和import的文件,这类混合写法会导致模块系统冲突。 - 无需使用
node --experimental-modules命令,该命令在Node.js 14+已废弃,仅保留type:module配置即可。
内容的提问来源于stack exchange,提问作者Saitae Saitama
相关产品推荐
相关产品推荐

