Создание модуля CJS из ESM со смешанным экспортом по имени и по умолчанию - как опустить «по умолчанию»?
Я пытаюсь настроить накопительный пакет для создания модуля commonjs из существующего esm. У меня есть набор отдельных автономных методов, экспортированных с
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'
- он не работает со смешанным экспортом по умолчанию / именованным экспортом, выдает ошибку.
2 ответа
Экспорт - это именованный экспорт, он просто назван. ESM построен так, что, если вы не укажете имя, он использует экспорт, названный из файла JS.
Используя CJS, нет концепции
default
экспорт, все названо.
Дело в том, что здесь нет ничего плохого. Вы не можете смешивать именованный экспорт и экспорт по умолчанию и использовать их без указания
.default
в CJS.
Может быть, эта суть темы поможет вам.
РЕДАКТИРОВАТЬ: вы всегда можете взломать его, как предполагает этот ответ , но это взлом, и тогда вы потеряете
named
экспорт.
Мы можем добиться этого, исправив накопительный пакет.
https://github.com/avisek/rollup-patch-seamless-default-export
// Default export
const lib = require('your-library')
lib('Hello') // <-- instead of using `.default` property
// Named exports
const { namedExport1, namedExport2 } = lib
// One liner syntex. Also supported.
const { default: defaultExport, namedExport1, namedExport2 } = require('your-library')