Webpack Deadcode Plugin 仅能定位死代码而无法自动删除,它只在构建时扫描并报告未使用文件与导出,不修改源码;真正删除需人工判断并操作。
不能靠插件“自动剔除”死代码——它只能帮你定位,真正删还得人来判、人来动。
这个插件本质是构建时的“扫描仪”,不是“手术刀”。它能列出 src/utils/legacy-api.js 没被任何模块 import,也能指出 export const deprecatedHelper 在整个依赖图里零引用,但不会碰你一行源文件。
stats: "verbose" 才显示完整未使用导出列表deadcode-report.json)里字段是 "unusedExports" 和 "unusedFiles",没有 "autoRemoved" 这种字段failOnUnused: true,构建会失败,但失败原因只是“发现死代码”,不是“删除失败”像 clang -O2 自带的 GlobalDCEPass 确实能删掉未调用的 C 函数,但它作用对象是 LLVM IR,不是你的 .ts 或 .jsx。你在 Webpack 里配再多个 -O2 也没用——那是给 C/C++/Rust 用的。
@export + externs + --compilation_level ADVANCED 实现函数重命名+未使用移除if (false) { ... } 会被删,但整个未引用的模块不会动treeShaking 仅限于 ESM 静态 import/export 分析,对 require() 或动态 import() 无能为力把插件当守门员,而不是清洁工。重点是让“发现死代码”变成可重复、可审查的动作。
webpack --env production --stats=none --no-bail + webpack-deadcode-plugin,把 JSON 报告上传到 artifactdeadcode-report.json,过滤掉 node_modules 和测试文件,生成 Markdown 摘要src/hooks/useLegacyAuth.ts,链接到报告详情rm,只输出 git ls-files | xargs grep -l "useLegacyAuth" 帮你确认真没人用最常被忽略的是动态引用场景——比如通过字符串拼接调用函数名 window[config.methodName](),或者用 Object.keys(obj).forEach(key => obj[key]())。这类代码即使完全没被静态分析捕获,也会被插件漏掉。人工 review 时得盯住这种模式,而不是只看插件报告里的文件列表。