Node.js:index.js报ERR_REQUIRE_ESM错误,改用mjs可行吗?
Node.js中.mjs与.js文件的ESM兼容问题解答
错误原因
你安装的inquirer、chalk最新版本已经是纯ES模块(ESM)。Node.js默认将.js文件识别为CommonJS模块,而CommonJS的require()语法无法加载ESM模块,因此抛出ERR_REQUIRE_ESM错误;.mjs文件会被Node.js直接当作ESM处理,支持ESM的import语法,所以能正常运行。
能不能全部使用.mjs文件?当然可以
完全可以将所有代码文件改用.mjs后缀,这是一种合规且简单的解决方案,尤其适合初学者快速解决问题。
全部使用.mjs有没有问题?
- 优势:完全适配现代Node.js的ESM生态,避免CommonJS与ESM的兼容冲突,后续使用ES新特性(如顶级await)更顺畅。
- 需要注意的细节:
- 所有模块导入/导出必须使用ESM语法(
import/export),不能再用CommonJS的require()/module.exports - 大部分CommonJS第三方包可以通过ESM的
import正常加载,兼容性良好 - 若后续使用工具链(如TypeScript、打包工具),只需对应配置ESM选项即可,初学者的简单项目几乎不受影响
- 所有模块导入/导出必须使用ESM语法(
两种可行解决方案
方案一:全部改用.mjs文件
将代码修改为ESM语法,保存为index.mjs:
import inquirer from 'inquirer'; import chalk from 'chalk'; inquirer.prompt([ {name: "p1", message: `${chalk.green("what is your first name: ")}`}, {name: "p2", message: `${chalk.green("what is years old: ")}`} ]) .then((answers) => { console.log(`${chalk.yellow(answers.p1, answers.p2)}`) const infoName = answers.p1 const infoAge = answers.p2 console.log(`his name is ${chalk.red(infoName)} and your age is ${chalk.red(infoAge)} years old`) }).catch((err) => { console.log(err) })
直接运行node index.mjs即可。
方案二:不改名,让.js文件支持ESM
在项目根目录创建或修改package.json,添加"type": "module"字段:
{ "type": "module" }
之后将代码中的require改为import,保存为index.js,运行node index.js即可正常执行。
备选方案:CommonJS中动态导入(不推荐初学者)
如果不想修改语法和文件类型,可以在CommonJS中使用异步动态import(),但代码会变成异步结构:
(async () => { const inquirer = await import('inquirer'); const chalk = await import('chalk'); await inquirer.default.prompt([ {name: "p1", message: `${chalk.default.green("what is your first name: ")}`}, {name: "p2", message: `${chalk.default.green("what is years old: ")}`} ]) .then((answers) => { console.log(`${chalk.default.yellow(answers.p1, answers.p2)}`) const infoName = answers.p1 const infoAge = answers.p2 console.log(`his name is ${chalk.default.red(infoName)} and your age is ${chalk.default.red(infoAge)} years old`) }).catch((err) => { console.log(err) }) })();
内容的提问来源于stack exchange,提问作者Anderson Rodrigues
相关产品推荐
相关产品推荐

