我正在尝试从 3 升级到 Webpack 4,并且在共享包的关闭时遇到问题。
我的 webpack 设置为创建一个在和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()
中的代码时,它会创建一个实例,然后调用从调用返回。对from 的任何后续调用,它不再创建 的实例,而是从 . 返回相同的值。然后在完成并运行之后,当调用时,它不会实例化,而是使用与使用相同的实例。在这种情况下,麻烦和是相同的实例。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
并在 Webpack 4 中获取对象的b.js
单独实例与shared.js
store
在 Webpack 3 中获取相同实例的原因?当脚本相互依赖时,它们的闭包/作用域应该如何处理共享代码?