Я смотрел на вывод Babel (версия 7.2.3, использующий preset-env
) сегодня на каком-то JavaScript, который я строю.Этот код будет использоваться исключительно в браузере, возможно, при медленных соединениях и на уже существующих веб-сайтах, поэтому я склоняюсь назад, чтобы сделать код максимально компактным.Большая часть трансплантации Бабеля происходила так, как я думал, но я был несколько удивлен тем, сколько избыточного кода он выдавал для поддержки экспорта.
В частности, я был удивлен, что это простое объявление -
export const foo = ... ,
bar = ... ,
baz = ... ;
передается нескольким наборам назначений -
exports.foo = exports.bar = exports.baz = void 0;
...
var foo = ... ,
bar = ... ,
baz = ... ;
...
exports.foo = foo;
exports.bar = bar;
exports.baz = baz;
, когда я ожидал чего-то более легкого и более прямого, как любая из двух форм ниже:
(ожидаемый и приемлемый)
var foo = ... ,
bar = ... ,
baz = ... ;
exports.foo = foo;
exports.bar = bar;
exports.baz = baz;
(идеально)
exports.foo = ... ;
exports.bar = ... ;
exports.baz = ... ;
Независимо от того, что я пробовал до сих порЯ не могу заставить Вавилон испускать что-либо короче или проще, чем результат, показанный выше.Кажется, что нет параметров конфигурации (что-то вроде --no-recursive-modules
), и я не вижу никаких изменений, которые я могу внести в объявления, чтобы Babel также вел себя лучше.Я бы все же предпочел использовать ключевое слово export
, а не писать объект exports
напрямую, поскольку синтаксис export
- это будущее.
Этот модуль написан плотно, поэтому в основном он состоит из небольшихфункции (и вызовы функций более высокого порядка), которые ссылаются друг на друга и почти все экспортируются - это означает, что около трети полученного JS после минимизации состоит из просто export
объявлений!
Бабель, вероятно, добавляет начальное назначение void 0
, чтобы быть осторожным с включением рекурсивного модуля или чего-то еще, но ничего из этого не происходит в этом модуле: импорт и экспорт строго в форме дерева, даже не в форме DAG - и определенноне рекурсивный или подобный графу.Это void 0
назначение - это просто потраченный впустую код, потраченное впустую время загрузки и потраченное впустую время выполнения в браузере.
tl; dr : Чтобы получить размер моего Babel-транспортируемогомодуль до того, что должно быть:
Как я могу запретить Вавилону выдавать бесполезное объявление exports.foo = exports.bar = ... = void 0;
в верхней части вывода?