WebPack 4 допускает дрожание дерева при объединении модулей узлов и требует, чтобы модули es6 могли успешно применять встряхивание дерева (https://webpack.js.org/guides/tree-shaking/).. Версия модуля es6 предоставляется через запись module
, версия es5. через запись main
.
В моем сценарии у меня есть несколько модулей, которые предоставляют только основной и некоторый модуль, и они ссылаются друг на друга. Интересно, каков ожидаемый результат в финальной пачке веб-пакета.
Пример:
ModuleA exposes both main and module
ModuleB exposes both main and module
ModuleC exposed only main
Driver is the application bundled via webpack 4.
Зависимости:
Driver -> [ModuleB, ModuleC]
ModuleB -> [ModuleA]
ModuleC -> [ModuleA]
Мои вопросы:
- сколько копий модуля А будет в комплекте?
- удастся ли Webpack упаковать модуль A?
Я столкнулся с этой проблемой с помощью rxjs (ModuleA в моем примере). У меня был необработанный модуль CJS, использующий rxjs, и модуль es6, использующий rxjs. Я обнаружил, что веб-пакет содержал две копии rxjs, версию es6 и версию es5, и это вызвало несовместимость в проверке «isObservable» (которая не смогла распознать, что копия Observable из версии es5 была совместима с Observable). из версии es6).
Основываясь на моих тестах, я выгляжу так, как будто было проблемой смешивать модули es6 и cjs в сборке веб-пакета, если на модуль es6 можно ссылаться (транзитивно) через модуль es6 и cjs.
Интересно, правда ли это как общее утверждение?
Если это так, то это означает, что я (и, возможно, другие пользователи веб-пакетов) должен будет детально понять цепочку зависимостей используемых модулей, а также природу (es6 vs cjs) каждого модуля в цепочке.
Есть ли какой-либо способ в веб-пакете, чтобы избежать повторного включения модулей?