require() of ES Module not supported

1,697 阅读1分钟

记一次报错记录

image.png 字面意思: 使用require()导入了一个ESM模块

但代码里明明使用的是import ESM的语法进行导入的,并未存在require();

错误场景:

代码:

import ora from 'ora';
import chalk from 'chalk';

async function spinner(text = '执行中') {
  const instance = (await ora)(text).start();
  return {
    succeed: async (text = '执行成功') => {
      instance.text = chalk.greenBright(text);
      instance.succeed();
    },
    fail: async (text = '执行失败') => {
      instance.text = chalk.redBright(text);
      instance.fail();
    },
  };
};

export default spinner

tsconfig.json

{
    "extends": "@eggjs/tsconfig",
    "compilerOptions": {},
    "exclude": [
        "node_modules/**",
    ],
    "include": [
        "app/**/*.ts",
        "app/lib/*.ts"
    ]
}

原因

最后学习之后发现

  • ora和chalk这两个包,均只提供了ESM的包,没有commonjs的引入方式;
  • import 是typescript给我们的使用方式,实际上Node配置的tsconfig.json 实际还是打包成commonjs
  • 而且node 并不好使用ESM

解决方案

  • 降低ora和chalk的版本

chalk: stackoverflow.com/questions/7…

ora: www.npmjs.com/package/ora…

image.png

扩展思考

  • CommonJS 和 ESM的区别,在浏览器和Node中的区别,各自的使用场景
  • 支持CommonJs 和 ESM的包入口方式分别是怎样的