mcpField
D
dead-code-detector

dead-code-detector

github.com/curiouslearner测试与质量2988 次安装53 周前更新
代码仓库

关于 dead-code-detector

用于识别未使用或不可达代码、导入项、依赖和类型的代码审查技能。它按删除风险整理发现,并提示需要留意的动态引用和公共 API,帮助开发者规划清理工作。

主要功能

  1. 01查找未使用的导入项、符号、变量和类型
  2. 02检查依赖及循环引用
  3. 03检测不可达代码路径
  4. 04按删除风险归类发现
  5. 05留意动态引用和公共 API

适用场景

  1. 01为代码库清理做准备
  2. 02移除软件包前检查依赖
  3. 03查找测试未覆盖的代码
  4. 04评估公共库中未使用的导出项

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/curiouslearner/devkit --skill dead-code-detector

安装后在 Claude Code 中输入/dead-code-detector确认已加载。

详细介绍

死代码检测技能

识别未使用的代码、导入项、变量和函数,以便安全移除。

说明

你是一名死代码检测专家。调用时:

  1. 扫描未使用的代码:

    • 未使用的导入项和依赖项
    • 未被引用的函数和方法
    • 未使用的变量和参数
    • 不可达的代码路径
    • 已注释掉的代码块
    • 代码库中仍存在的已弃用函数
    • 未使用的 CSS 类和样式
    • 未使用的类型定义
  2. 分析依赖项:

    • 已安装但未在任何地方导入的包
    • 在生产环境中使用的开发依赖项
    • 仅在开发/测试环境中使用的生产依赖项
    • 循环依赖
  3. 检查代码可达性:

    • 从未被调用的函数
    • return 语句之后的代码
    • 不可能成立的条件分支
    • 模块中未使用的导出项
  4. 生成报告:将发现的问题分类:

    • 可安全移除:确定未被使用
    • 可能未使用:可能通过动态方式或在测试中使用
    • 需要审核:已导出但内部未使用(可能在外部使用)

检测类别

未使用的导入项
// 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:谨慎处理已导出的函数

移除策略

  1. 从安全项开始:先移除明显未使用的代码
  2. 每次移除后测试:每次移除后都运行测试
  3. 检查导入项:更新导入语句
  4. 搜索代码库:使用 grep 搜索字符串引用
  5. 审核导出项:对于公共包,考虑 semver
  6. 记录说明:在提交信息中说明移除代码的原因

备注

  • 某些“未使用”的代码可能通过反射或动态导入被使用
  • 公共库应采取更谨慎的做法
  • 检查文档和示例中是否有相关引用
  • 考虑为公共 API 设置弃用期
  • 将移除代码的提交分开,并确保每个提交都是原子性的

评论

支持 Markdown