Javascript 为什么webpack 4包含用于单个命名导入的整个文件?
给定以下两个文件:Javascript 为什么webpack 4包含用于单个命名导入的整个文件?,javascript,webpack,webpack-4,tree-shaking,Javascript,Webpack,Webpack 4,Tree Shaking,给定以下两个文件: //a.js 导出常数X=/*#uuuu纯uuu*/“X”; 常数a=函数(){ 返回“大约一个!”; }; a、 foo=函数(){ 返回“foo”; }; 导出默认值a; 及 //main.js 从“/a”导入{X}; 从“/b”导入{Y}”; 控制台日志(X,Y); 我补充说 “副作用”:false至package.json optimization.usedExports:true到webpack.config.js 但是运行webpack-p仍然包括捆绑包中
//a.js
导出常数X=/*#uuuu纯uuu*/“X”;
常数a=函数(){
返回“大约一个!”;
};
a、 foo=函数(){
返回“foo”;
};
导出默认值a;
及
//main.js
从“/a”导入{X};
从“/b”导入{Y}”;
控制台日志(X,Y);
我补充说
至“副作用”:false
package.json
到optimization.usedExports:true
webpack.config.js
webpack-p
仍然包括捆绑包中的整个a.js
文件。汇总仅包括来自a.js的X
()
删除a.foo
定义“修复”了问题,但不是演示存储库之外的解决方案。
我已经多次阅读文档页面,在网页问题跟踪器上阅读了[无数关于树摇晃的问题,我仍然无法理解以下内容:
- 为什么没有使用
X
上的/*#uu_u纯_*/
标记
- 有没有办法将webpack配置为只包含
a.js
中的X
您还可以签出以查看完整的网页包配置和相应的next.js/react问题(请参阅pages/index.jsx),这导致我出现了这个特定问题。我的猜测:导出默认值影响树抖动。
见:
在网页上的问题跟踪器提供了一个答案后,请尝试在引发问题后不删除默认值
:
似乎一个简短的压缩过程不足以压缩这段代码
默认的通过次数是1,但一旦提高到3,a.js
就不再完全内联。这就是如何以更长的构建时间为代价实现的
const TerserWebpackPlugin = require("terser-webpack-plugin");
/** @type {import("webpack").Configuration} */
module.exports = {
optimization: {
minimizer: [
new TerserWebpackPlugin({
terserOptions: {
compress: {
passes: 3
}
}
})
]
}
}
正如我的问题中提到的,如果我删除了a.foo=
定义,默认导出是正确的树震动。此外,无论是否使用a.foo
定义,导出都正确标记为/*未使用的和谐默认导出*/
文章很有趣,我将查看它建议的插件文章中描述的问题无法检测到树震动故障,这可以解释a.js的完整内联