You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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选项即可,初学者的简单项目几乎不受影响

两种可行解决方案

方案一:全部改用.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 02:15:25