Node.js 16中使用translate模块时import语句报错的解决方案咨询
解决CommonJS项目中使用ES模块translate的问题
问题背景
当前使用Node.js 16,项目整体基于CommonJS规范(用require导入模块),但要使用的translate是纯ES模块,只能用import导入。尝试直接用import会报错Cannot use import statement outside a module;添加"type": "module"到package.json后,原有require代码又报错require is not defined in ES module scope;用.mjs文件封装后,CommonJS文件用require导入该.mjs文件时,报错Error [ERR_REQUIRE_ESM]: require() of ES Module ... not supported。
可行解决方案
方案1:在CommonJS中直接使用动态import()
CommonJS模块支持动态import()语法,可异步加载ES模块。修改你的translaction.js:
const translateService = async (text, targetLang = 'es') => { // 动态加载translate模块 const { default: translate } = await import('translate'); return translate(text, targetLang); }; module.exports = { translateService, };
调用该服务时需用异步方式:
const { translateService } = require('./translaction.js'); async function run() { const result = await translateService('Hello world'); console.log(result); } run();
方案2:用.mjs封装模块后动态导入
先修改translate.mjs为标准ES模块导出:
import translate from 'translate'; export const translateDatas = async (text, targetLang = 'es') => { return await translate(text, targetLang); };
再在CommonJS的translaction.js中通过动态import加载:
let translateDatas; // 提前预加载模块,避免每次调用重复加载 (async () => { const module = await import('../utils/translate.mjs'); translateDatas = module.translateDatas; })(); const translateService = async (text) => { // 若预加载未完成,实时加载模块 if (!translateDatas) { const module = await import('../utils/translate.mjs'); translateDatas = module.translateDatas; } return translateDatas(text); }; module.exports = { translateService, };
方案3:逐步迁移到ES模块(长期优化方案)
如果项目有长期维护计划,可逐步将CommonJS代码转为ES模块:
- 保留package.json中的
"type": "module"配置 - 将所有
require()替换为import语句,module.exports替换为export语法 - Node.js 16对ES模块支持完善,项目依赖(如mongoose)均支持
import导入
注意事项
- 动态
import()返回Promise,相关逻辑必须用async/await处理 - 确保
translate模块的配置(如API密钥)正确,可参考模块文档完成设置
内容的提问来源于stack exchange,提问作者Haris George
相关产品推荐
相关产品推荐

