Как я могу запретить Babel дважды отправлять экспортные декларации? - PullRequest
0 голосов
/ 29 января 2019

Я смотрел на вывод 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; в верхней части вывода?

...