如何将组合默认导出与非默认导出的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
相关产品推荐
相关产品推荐

