静态分析(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.js
import { square } from './util';
console.log(square(2)); // 仅使用 square 方法
src/util.js
export function square(x) {
return x * x;
}
export function cube(x) {
return x * x * x;
}
webpack.config.js
const 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 的效果。