Я пытаюсь перейти на 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 и теперь используем встроенную настройку оптимизации. Ниже показано, как они оба были настроены.
ВЕБ-ПАКЕТ 3:
plugins: [..., new webpack.optimize.CommonsChunkPlugin({
name: 'shared',
filename: '[name].js',
minChunks: 2
})]
ВЕБ-ПАКЕТ 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? Когда сценарии полагаются друг на друга, как их замыкания/области действия должны обрабатывать общий код?