问题描述
我正在尝试配置汇总以从现有 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;
//...
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
导出。