Я пытаюсь перейти на Webpack 4 из 3 и у меня проблемы с закрытием общего пакета.
Мой веб-пакет настроен на создание файла shared.js
с общим кодом от a.js
до b.js
. В частности, в пакете shared.js
есть индексный файл с переменной store
. Мы экспортируем только функцию с именем getStore()
, которая возвращает store
. Этот вызов для getStore
происходит в разных местах в наших a.js
и b.js
файлах.
Список наших скриптов на нашей странице выглядит следующим образом:
/** some html **/
<script src=""/scripts/shared.js""></script>
<script src=""/scripts/a.js""></script>
<script src=""/scripts/b.js""></script>
В Webpack 3, при вызове кода getStore()
, который находится в shared.js
(вызов поступает) из a.js
в первый раз, он создает экземпляр store
, который затем вызывает возврат store
из getStore()
звонок. При любых последующих вызовах getStore()
из a.js
он больше не создает экземпляр store
, а возвращает те же значения из getStore()
. Затем, после завершения a.js
и запуска b.js
, когда b.js
вызывает getStore()
, он не создает экземпляр store
, а использует тот же экземпляр, который использовал a.js
. В этом случае store
- это один и тот же экземпляр для всех остальных a.js
и b.js
.
Однако в Webpack 4 поведение отличается. Когда a.js
вызывает код в shared.js
, когда код впервые ссылается на getStore()
, аналогично предыдущему, он создаст новый экземпляр store
, и пока a.js
запускается и вызывает getStore()
, он возвращает то же самое пример. Однако, когда b.js
делает начальную ссылку на код shared.js
, он не использует тот же самый экземпляр a.js
, который используется, скорее он создает новый экземпляр store
и на протяжении всего запуска сценария b.js
он ссылается на второй store
при вызове getStore()
. В этом случае есть два экземпляра store
, каждый из которых уникален для a.js
и b.js
.
Не уверен, что отличает Webpack 4 от этой проблемы. Мы перешли от использования CommonChunksPlugin
в Webpack 3 и теперь используем встроенный параметр оптимизации. Ниже показано, как они были настроены.
WEBPACK 3:
plugins: [..., new webpack.optimize.CommonsChunkPlugin({
name: 'shared',
filename: '[name].js',
minChunks: 2
})]
WEBPACK 4:
optimization: {
splitChunks: {
cacheGroups: {
shared: {
name: 'shared',
chunks: 'initial',
minChunks: 2
}
}
}
}
Обе конфигурации Webpack выделяют файлы примерно одинакового размера, и при отладке и просмотре стека вызовов поступают вызовы для getStore()
из соответствующих файлов a / b.js.
Есть ли объяснение, почему a.js
и b.js
получают отдельные экземпляры объекта shared.js
store
в Webpack 4 по сравнению с тем, что получает те же экземпляры, что и в Webpack 3? Когда сценарии зависят друг от друга, как их замыкания / области действия должны обрабатывать общий код?