静态分析(Static Analysis):
import 和 export 语句,构建模块依赖图。标记未使用的代码(Mark Unused Code):
删除未使用的代码(Eliminate Dead Code):
Terser 等工具进行代码压缩。Terser 会移除那些标记为未使用的代码,最终生成一个更小的打包文件。import 和 export),因为它们是静态的,允许编译器进行可靠的依赖分析。package.json 中的 sideEffects 字段来声明哪些文件具有副作用。以下是一个启用 Tree Shaking 的 Webpack 配置示例:
src/
index.js
util.js
webpack.config.js
package.json
src/index.jsimport { square } from './util';
console.log(square(2)); // 仅使用 square 方法
src/util.jsexport function square(x) {
return x * x;
}
export function cube(x) {
return x * x * x;
}
webpack.config.jsconst path = require('path');
module.exports = {
mode: 'production', // 启用生产模式以便启用 Tree Shaking
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
},
optimization: {
usedExports: true, // 标记未使用的导出
},
};
package.json{
"name": "tree-shaking-example",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"scripts": {
"build": "webpack"
},
"devDependencies": {
"webpack": "^5.0.0",
"webpack-cli": "^4.0.0"
},
"sideEffects": false // 声明模块无副作用
}
npm install
npm run build
sideEffects 字段:
sideEffects: false:告诉 Webpack 项目中的所有文件都没有副作用,可以安全地进行 Tree Shaking。sideEffects: ["*.css"]:声明只有 CSS 文件有副作用,其他文件没有。optimization.usedExports:
usedExports 选项,Webpack 会在模块中标记哪些导出是未使用的。optimization.minimize:
minimize 选项,Webpack 会使用 Terser 或其他压缩工具来删除未使用的代码。sideEffects 字段正确声明,否则可能会导致代码被错误地删除。Tree Shaking 是一种有效的优化技术,可以显著减少 JavaScript 应用的打包体积。通过合理配置 Webpack,可以在生产环境中利用 Tree Shaking 来删除未使用的代码,提高应用性能。然而,需要注意模块的副作用声明和正确使用 ES6 模块,以确保 Tree Shaking 的效果。