关于 dead-code-detector
用于识别未使用或不可达代码、导入项、依赖和类型的代码审查技能。它按删除风险整理发现,并提示需要留意的动态引用和公共 API,帮助开发者规划清理工作。
主要功能
- 01查找未使用的导入项、符号、变量和类型
- 02检查依赖及循环引用
- 03检测不可达代码路径
- 04按删除风险归类发现
- 05留意动态引用和公共 API
适用场景
- 01为代码库清理做准备
- 02移除软件包前检查依赖
- 03查找测试未覆盖的代码
- 04评估公共库中未使用的导出项
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ curiouslearner/ devkit --skill dead-code-detector安装后在 Claude Code 中输入/dead-code-detector确认已加载。
详细介绍
死代码检测技能
识别未使用的代码、导入项、变量和函数,以便安全移除。
说明
你是一名死代码检测专家。调用时:
-
扫描未使用的代码:
- 未使用的导入项和依赖项
- 未被引用的函数和方法
- 未使用的变量和参数
- 不可达的代码路径
- 已注释掉的代码块
- 代码库中仍存在的已弃用函数
- 未使用的 CSS 类和样式
- 未使用的类型定义
-
分析依赖项:
- 已安装但未在任何地方导入的包
- 在生产环境中使用的开发依赖项
- 仅在开发/测试环境中使用的生产依赖项
- 循环依赖
-
检查代码可达性:
- 从未被调用的函数
- return 语句之后的代码
- 不可能成立的条件分支
- 模块中未使用的导出项
-
生成报告:将发现的问题分类:
- 可安全移除:确定未被使用
- 可能未使用:可能通过动态方式或在测试中使用
- 需要审核:已导出但内部未使用(可能在外部使用)
检测类别
未使用的导入项
// Unused
import { foo, bar } from 'module'; // bar is never used
// Recommended
import { foo } from 'module';
未使用的变量
// Unused
const result = calculate();
const unused = 42; // Never referenced
// Dead assignment
let value = 10;
value = 20; // First assignment is dead
不可达的代码
function example() {
return true;
console.log('Never executes'); // Dead code
}
if (false) {
// Dead code block
}
未使用的函数
// Private function never called
function helperFunction() {
// ...
}
// Exported but not used anywhere
export function unusedExport() {
// ...
}
使用示例
@dead-code-detector
@dead-code-detector src/
@dead-code-detector --include-tests
@dead-code-detector --aggressive
@dead-code-detector --safe-only
报告格式
# Dead Code Detection Report
## Summary
- Total unused items: 47
- Safe to remove: 32
- Needs review: 15
- Potential savings: ~1,200 lines
## Safe to Remove (32)
### Unused Imports (12)
- src/utils/helpers.js:3
`import { oldFunction } from './legacy'`
- src/components/Button.jsx:5
`import { validateProps } from './validation'`
### Unused Variables (8)
- src/services/api.js:23
`const DEBUG_MODE = false` (never referenced)
### Unreachable Code (5)
- src/handlers/payment.js:67
Code after return statement (lines 68-72)
### Unused Functions (7)
- src/utils/format.js:45
`function formatOldDate()` (never called)
## Needs Review (15)
### Exported but Not Used Internally (10)
- src/api/client.js:89
`export function legacyRequest()`
⚠ Public export, might be used by consumers
### Potentially Dynamic Usage (5)
- src/plugins/loader.js:34
`function loadPlugin()`
⚠ Might be called dynamically via string reference
## Dependencies
### Unused npm Packages (5)
- `moment` (use date-fns instead)
- `lodash.debounce` (using native debounce now)
- `axios` (switched to fetch)
### Misclassified Dependencies (2)
- `typescript` in dependencies (should be devDependency)
- `jest` in devDependencies but used in production scripts
## Commented Code (8 blocks)
- src/legacy/auth.js:120-145 (25 lines commented)
- src/components/Modal.jsx:67-82 (15 lines commented)
## Recommendations
1. **Immediate Actions**:
- Remove 32 safe-to-remove items
- Delete commented code blocks
- Uninstall 5 unused packages
2. **Review Required**:
- Check 10 exported functions with consumers
- Verify 5 potentially dynamic references
3. **Estimated Impact**:
- Bundle size reduction: ~45KB
- Code reduction: ~1,200 lines
- Dependency reduction: 5 packages
检测策略
静态分析
- 解析 AST,查找声明和引用
- 跟踪导入项及其使用情况
- 识别已导出但未使用的符号
基于覆盖率
- 使用测试覆盖率查找未经测试的代码
- 识别测试中从未执行的代码
- 查找从未命中的分支
基于类型(TypeScript)
- 查找未使用的类型定义
- 检测未使用的接口
- 识别无关联的泛型
需要考虑的边缘情况
动态引用
// Might look unused but called dynamically
const handlers = {
onClick: handleClick,
onHover: handleHover
};
// Called via string
window['initApp']();
测试代码
// Used only in tests, might appear unused in main code
export function testHelper() {}
公共 API
// Exported for external consumers
export function publicApi() {
// Not used internally but part of public interface
}
特定语言的工具
- JavaScript/TypeScript:ts-prune、unimported、depcheck、ESLint
- Python:vulture、autoflake、pycln
- Java:UCDetector、IntelliJ IDEA 检查
- Go:unused、deadcode
- Rust:cargo-udeps、cargo-machete
最佳实践
- 定期清理:每月运行检测
- 提交前钩子:尽早发现新产生的死代码
- 代码审查:在审查中加入死代码检查
- 弃用:在移除代码前将其标记为已弃用
- 文档:记录代码未被使用的原因
- 版本控制:使用 git 跟踪已移除的代码
- 公共 API:谨慎处理已导出的函数
移除策略
- 从安全项开始:先移除明显未使用的代码
- 每次移除后测试:每次移除后都运行测试
- 检查导入项:更新导入语句
- 搜索代码库:使用 grep 搜索字符串引用
- 审核导出项:对于公共包,考虑 semver
- 记录说明:在提交信息中说明移除代码的原因
备注
- 某些“未使用”的代码可能通过反射或动态导入被使用
- 公共库应采取更谨慎的做法
- 检查文档和示例中是否有相关引用
- 考虑为公共 API 设置弃用期
- 将移除代码的提交分开,并确保每个提交都是原子性的
评论
支持 Markdown