要真正剔除Dead Code,需分阶段协同:ES模块识别→副作用声明→压缩器执行;关键在禁用Babel modules转换、设sideEffects、配Terser drop_console/drop_debugger,esbuild则依赖更干净代码结构。

要让打包产物真正剔除 Dead Code,不能只靠“开了 Tree Shaking”就认为万事大吉。Terser 和 esbuild 是执行删除动作的关键环节,但它们只负责“清理”,前提是 Webpack/Vite/Rollup 已经准确标记出哪些是死代码。整个过程是分阶段的:静态分析 → 标记未使用导出 → 压缩器删除。下面从实操角度拆解关键控制点。
确保模块系统被正确识别
Tree Shaking 的前提不是“用了 import”,而是整个依赖链都基于 ES 模块静态结构。CommonJS(require/module.exports)会直接中断分析链条。
- 项目源码必须用 import/export,Babel 配置中禁用 modules 转换:
{"modules": false} - 第三方库要选 ESM 版本,例如用
lodash-es替代lodash;检查其package.json是否含"module"或"exports"字段 - 避免
import *或动态 key 导出(如obj[flag] = fn),这类写法会让工具无法判定导出是否被引用
显式声明副作用边界
即使代码没被调用,如果工具认为它可能产生副作用(比如执行了全局样式注入、修改 window 属性、调用 alert),就不会删除——这是安全机制,但常被误判为“摇不掉”。
宝塔面板11.3.0是一款针对Linux服务器设计的可视化管理工具,通过重构核心模块实现资源占用显著降低,尤其适合低配置服务器环境。它将复杂的命令行操作转化为直观的图形界面,帮助开发者快速完成网站部署、环境配置及日常运维工作,无需专业技术背景即可高效管理服务器。
- 在项目根目录
package.json中设置"sideEffects": false表示所有模块默认无副作用 - 若存在真实副作用文件(如
src/main.css、src/init.js),改用数组形式明确列出:"sideEffects": ["*.css", "src/init.js"] - 对单个导入语句加
/*#__PURE__*/注释,可提示压缩器该调用无副作用,便于内联或移除
配置 Terser 真正执行删除
Webpack 生产模式默认启用 TerserPlugin,但默认配置不会删 console.log、debugger 或未导出的私有函数。需主动开启压缩粒度:
- 启用逻辑压缩:
compress: { drop_console: true, drop_debugger: true } - 混淆变量名(可选但推荐):
mangle: true,配合keep_fnames: false进一步减小体积 - 清除注释:
format: { comments: false },并设extractComments: false防止生成 LICENSE 文件 - 注意:这些配置与
devtool冲突,如eval-cheap-module-source-map会禁用部分删除,生产环境应使用source-map或hidden-source-map
esbuild 的差异处理与取舍
Vite 默认用 esbuild 做预构建和压缩,它比 Terser 快很多,但静态分析能力略弱——尤其对复杂条件逻辑、间接引用、高阶函数推导不如 Terser 精准。
- esbuild 不支持
/*#__PURE__*/标记,也不识别sideEffects字段,所以必须依赖更干净的原始代码结构 - 若发现某些工具函数没被摇掉,优先检查是否被闭包捕获、是否通过字符串 key 动态访问、是否出现在 try/catch 中(esbuild 对异常路径保守保留)
- 可临时切换回 Terser 验证:Vite 中设
build.minify: 'terser',对比产物差异定位问题模块


















