Финальное редактирование
Разрешение tl; dr заключается в том, что это невозможно. Хотя верхний ответ ниже содержит некоторую хорошую информацию.
Рассмотрим приведенный ниже код, от contacts.js
. Это динамически загруженный модуль, загружаемый по требованию с помощью System.import
в другом месте кода.
Если SharedUtil1
также используется в других модулях, которые также динамически загружаются с помощью System.import
, как бы я хотел иметь SharedUtility1
исключенный из all эти модули и загружались только по требованию в первый раз?
Верхний уровень System.import
SharedUtil1
не будет работать, так как мой экспорт зависит от него: экспорт может быть размещен только на верхнем уровне кода модуля, а не на любом обратном вызове.
Возможно ли это с помощью Webpack? Я на бета-версии 2.0.7.
import SharedUtil1 from '../../SharedUtilities/SharedUtility1';
class Contacts{
constructor(data){
this.data = data;
this.sharedUtil1 = new SharedUtil1();
}
}
export default Contacts;
ОБНОВЛЕНИЕ 1
Я думал, что загрузчик пакетов был тем, что я хотел, но нет, что превратит ваш импортированный модуль в другую функцию, которую вы вызываете с обратным вызовом чтобы перейти к фактическому модулю, как только он загрузится асинхронно. Это означает, что вы не можете прозрачно сделать модуль X загруженным асинхронно без внесения каких-либо изменений в свой код, не говоря уже о том, что вы вернулись к описанной проблеме, если ваш модуль верхнего уровня зависит от асинхронного загруженной зависимости, нет способа экспортировать ее, поскольку экспорт должен находиться на верхнем уровне.
Нет ли способа в Webpack указать, что зависимость X должна быть загружена по требованию, если это необходимо, и иметь какие-либо импортированные модули, которые импортируют ее для прозрачного ожидания процесса импорта? Я бы подумал, что этот случай использования будет синусоидальным для любого удаленного приложения, поэтому я должен думать, что я просто что-то пропустил.
ОБНОВЛЕНИЕ 2
В ответ на Питер я попытался получить работу по дедупликации, поскольку плагин commonChunk относится к коду обмена между конечными точками, как он упоминал, а так как require.ensure
помещает загруженный код в обратный вызов, тем самым предотвращая вас от ES6 export
с любым кодом, который зависит от него.
Что касается дедупликации, contacts.js
и tasks.js
загружают один и тот же sharedUtil, как, например,
import SharedUtil1 from '../../sharedUtilities/sharedUtility1';
Я попробовал запустить webpack как
webpack --optimize-dedupe
а также добавив
plugins: [
new webpack.optimize.DedupePlugin()
]
в webpack.config. В обоих случаях, хотя код sharedUtil по-прежнему помещается как в пакеты контактов, так и в задачи.