晚上好!
我已经尝试了几天,以使不同程序包之间的树摇晃起来。
在继续之前,我已经创建了一个最低再现,我将在整个帖子中进行解释:https://github.com/Apidcloud/tree-shaking-webpack
我还打开了有关Webpack存储库的一个问题:https://github.com/webpack/webpack/issues/8951
为简单起见,该示例仅使用webpack。 未使用Babel 。
上面的示例有两个软件包,每个软件包都有各自的捆绑包:
core
-导出2个函数,cube
和unusedFn
consumer
-从cube
导入core
并导出自己的功能consumerFn
请注意,square
函数不会导出到index.js
文件中。知道至少在core
内树木摇晃确实有效,这是一种方法,因为它不包含在最终捆绑包中(这是正确的)。
如您所见,仅从cube
导入core
。然后,它消耗consumerFn
导出自己的函数(cube
)。
问题在于consumer
捆绑包中包含core
捆绑包中的所有内容。也就是说,在不应该包含unusedFn
的情况下会产生更大的捆绑包。
最终,目标是在具有多个软件包的monorepo中执行相同的操作。如果每个软件包都将其他软件包捆绑在一起,那么拥有它们毫无意义。目标是仅捆绑每个软件包所需的内容。
使用optimizationBailout
,我看到 ModuleConcatenation 插件发出了一些警告消息。我还使用了--verbose
标志:
这是我的webpack.config.js
:
const path = require('path');
module.exports = {
mode: 'production',
entry: {
core: './src/index.js',
consumer: './consumer/index.js'
},
output: {
filename: '[name].js',
path: path.resolve(__dirname, 'dist'),
// for simplicity sake I removed the UMD specifics here.
// the problem is the same, with or without it.
},
optimization: {
usedExports: true,
sideEffects: true
},
stats: {
// Examine all modules
maxModules: Infinity,
// Display bailout reasons
optimizationBailout: true
}
};
我在"sideEffects": false
中也有package.json
。
我也经历过webpack的guide,但是我不确定缺少什么。