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

如何将组合默认导出与非默认导出的ES模块代码转换为Node.js CommonJS语法

ESM 转 CommonJS 写法说明

原有写法的问题

你的尝试存在两处问题:

  • 语法错误:require("./b) 缺少闭合的双引号
  • 逻辑错误:展开require("./a")的内容会将a模块的所有导出项平铺到当前模块的导出对象中,无法实现默认导出a的需求。

同时你给出的期望 CommonJS 导入写法const a, { b } = require("index");本身不符合JavaScript语法规范,无法在同一条变量声明语句中同时声明普通变量和解构变量,需要拆分书写。


正确实现方案

方案1:遵循 Node.js 官方模块互操作标准

符合Node.js ESM与CJS原生互操作规则,和ESM的导出逻辑完全对齐:

// 导入依赖,兼容目标模块是ESM转CJS的场景
const a = require('./a').default ?? require('./a');
const b = require('./b').default ?? require('./b');

module.exports = {
  default: a,
  b
};

对应的导入写法:

// 对应 ESM 写法 import a, { b } from "index"
const { default: a, b } = require("index");

方案2:兼容简化导入写法

如果你需要支持const a = require("index")直接获取默认导出,同时支持const { b } = require("index")获取命名导出,仅适用于默认导出a为对象类型的场景:

// 导入依赖,兼容目标模块是ESM转CJS的场景
const a = require('./a').default ?? require('./a');
const b = require('./b').default ?? require('./b');

// 将命名导出挂载到默认导出对象上
module.exports = Object.assign(a, { b });

对应的导入写法:

// 直接获取默认导出
const a = require("index");
// 解构获取命名导出
const { b } = require("index");

内容的提问来源于stack exchange,提问作者user13594285

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:27:01