如何在NestJS中导入ESM模块?引入Ora包遇ERR_REQUIRE_ESM错误
解决NestJS中使用Ora包出现的ERR_REQUIRE_ESM错误
你的问题核心是Ora v6+是纯ESM包,而NestJS默认的开发构建(nest start --watch)使用Webpack将代码编译为CommonJS,导致require()加载ESM包时触发错误。以下是几种可行的解决方案:
方案1:将项目切换为完全ESM模式
让整个项目采用ESM规范,从根源避免CommonJS与ESM的兼容性问题:
- 修改
package.json,添加type字段:
{ "type": "module" }
- 更新
tsconfig.json的编译配置:
{ "compilerOptions": { "module": "ESNext", "moduleResolution": "Bundler", "target": "ES2022", "lib": ["ES2022"], "outDir": "./dist", "esModuleInterop": true, "skipLibCheck": true, "strict": true, "allowSyntheticDefaultImports": true } }
- 调整
nest-cli.json以适配ESM的Webpack构建:
{ "$schema": "https://json.schemastore.org/nest-cli", "collection": "@nestjs/schematics", "sourceRoot": "src", "compilerOptions": { "deleteOutDir": true, "webpack": true, "webpackConfig": "./webpack.config.js" } }
- 创建
webpack.config.js配置文件:
module.exports = (options) => ({ ...options, output: { ...options.output, libraryTarget: 'module', module: true, filename: '[name].mjs' }, experiments: { outputModule: true }, resolve: { ...options.resolve, extensions: ['.mjs', '.js', '.ts'] } });
- 之后直接使用静态导入即可:
import ora from 'ora'; const spinner = ora('加载中...').start();
方案2:降级Ora到支持CommonJS的版本
如果不想改动项目模块规范,可以降级到Ora v5.x版本(该版本同时支持CommonJS和ESM):
npm uninstall ora npm install ora@5
安装完成后,原有的静态导入或动态导入方式都能正常工作,无需额外配置。
方案3:配置Webpack强制动态导入(针对现有CommonJS项目)
若坚持使用CommonJS项目结构,需确保Webpack不对Ora的导入做静态转译:
- 确保代码中使用动态导入:
async function runTask() { const { default: ora } = await import('ora'); const spinner = ora('处理中...').start(); // 后续逻辑 }
- 修改
webpack.config.js,禁用对Ora的静态分析:
module.exports = (options) => ({ ...options, module: { ...options.module, rules: [ ...options.module.rules, { test: /ora/, parser: { amd: false, commonjs: false } } ] } });
这种方式让Webpack保留动态导入的代码,避免编译为require()语句。
内容的提问来源于stack exchange,提问作者Islam Y-
相关产品推荐
相关产品推荐

