使用混合命名和默认导出从 ESM 构建 CJS 模块 - 如何省略“默认”?

问题描述

我正在尝试配置汇总以从现有 esm 构建 commonjs 模块。 我有一组单独的独立方法,使用 default 导出,可直接从包中导入,例如:

import method1 from 'lib/method1'

而且我对所有这些 standalone.js 都有一个入口点,让用户代码使用解构或立即作为 lib 分别导入它们。

import _method1 from './method1'
import _method2 from './method2'
import _method3 from './method3'

export const method1 = _method1;
export const method2 = _method2;
export const method3 = _method3;

export default {method1,method2,method3};

这是使用示例:

import method1 from 'lib/method1'
//or
import { method1 } from 'lib/standalone'
//or
import standalone from 'lib/standalone'
//standalone.method1();

所有这些都适用于 esm,我希望 cjs 有类似的体验。 汇总所做的一切几乎都是正确的,但它抱怨混合命名/认导出并添加额外的 module.exports.default 字段:

'use strict';

Object.defineProperty(exports,'__esModule',{ value: true });

var condense$1 = require('./condense.js');
var condenseDeep$1 = require('./condenseDeep.js');
var eachDeep$1 = require('./eachDeep.js');
// ...


var condense = condense$1;
var condenseDeep = condenseDeep$1;
var eachDeep = eachDeep$1;
//...

var standalone = {
  condense: condense$1,condenseDeep: condenseDeep$1,eachDeep: eachDeep$1,//...
};

exports.condense = condense;
exports.condenseDeep = condenseDeep;
exports.default = standalone; // <-- this one,how to remove it?
exports.eachDeep = eachDeep;
//...

所以在 commionjs 中的用法看起来像:

const method1 = require('lib/method1');
//or
const { method1 } = require ('lib/standalone');
//or
const standalone = require('lib/standalone');
//standalone.method1();
//standalone.default <--- this is redundant and confusing

我尝试了 output.exports: 'named' 汇总选项 - 其他仅使用认值的入口点也开始使用 module.exports.default = .. 而不是预期的 module.exports = ..

我尝试了 output.exports: 'default' - 它不适用于混合认/命名导出,引发错误

解决方法

default 导出 命名导出,它只是命名为 default。 ESM 的构建方式是,如果您不指定名称,它会使用来自 JS 文件的名为 default 的导出。

使用 CJS,没有 default 导出的概念,一切都是命名的。

重点是,这里没有错。您不能在 CJS 中没有指定 .default 的情况下混合命名和默认导出并使用它们。

也许 this gist thread 会帮助你。

编辑:你总是可以破解它 as this answer suggests,但它是一个黑客,然后你会丢失 named 导出。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...