Предотвратить перемещение компилятором кода из одного куска в другой? - PullRequest
0 голосов
/ 06 июля 2018

Я прочитал на этот ответ на следующее утверждение:

"Имейте в виду, что компилятор может и действительно перемещает код из одного блока в другие файлы вывода блока, если он определит, что он используется только этим блоком."

Есть ли способ отключить это?

У меня есть «основной» чанк и «необязательный» чанк, и я обнаружил, что код из необязательного чанка полностью перемещается в основной. Мой необязательный код будет вызываться только из основного кода, но только в том случае, если определено, что мы действительно хотим загрузить необязательный материал (на основе флага, который является внешним для обоих).

Я хочу минимизировать размер основного кода для случаев, когда необязательный материал не нужен, но, насколько я вижу, это невозможно при закрытии.

EDIT: Чтобы разделить код, я использую опции -chunk в командной строке (java). «Основной» - я указываю на несколько папок («src / Infra / *. Js» и т. Д.) И использую «auto» для numFiles для чанка. «Необязательно» Я указываю на три конкретных файла без подстановочных знаков и указываю 3 как numFiles. Чтобы загрузить «необязательный» скрипт, «main» записывает тег скрипта на страницу и имеет разрешение Promise при загрузке. Предполагается, что 'option' создает экземпляр класса, который он определяет, и помещает ссылку на этот экземпляр в массив в глобальном пространстве имен, затем main читает ссылку из массива и вызывает для него метод init (), передавая некоторые зависимости. , Есть ли лучше поддерживаемый (и такой же компактный) способ сделать это?

EDIT2: в случае, если у кого-то есть подобная проблема, я решил ее, используя функцию «nameCache» в uglifyjs, поэтому отдельные компоненты не обязательно нужно компилировать одновременно.

1 Ответ

0 голосов
/ 11 июля 2018

Компилятор не перемещает код «вверх» по модулю графа. Происходит то, что компилятор почему-то считает, что символы, определенные в вашем необязательном чанке, необходимы напрямую.

Чаще всего это происходит потому, что вы используете управление зависимостями и модули. Когда компилятор сортирует зависимости, если любой из «необязательных» файлов напрямую импортируется через require для CommonJS, import для ES6 или goog.require для закрытия. В этом случае компилятор добавляет их в основной модуль.

Чтобы быть более точным, я бы на самом деле должен был увидеть код.

...