文档

Knip - 死代码检测工具

使用 Knip 检测和清理项目中未使用的代码、文件和依赖

Knip - 死代码检测工具

Knip 是一个强大的工具,用于检测 JavaScript/TypeScript 项目中未使用的代码、文件和依赖。它可以帮助我们保持代码库的整洁,减少包体积,提升项目性能。

功能特性

  • 🔍 检测未使用的文件 - 找出项目中没有被引用的文件
  • 📦 检测未使用的依赖 - 识别 package.json 中未使用的依赖包
  • 🚫 检测未使用的导出 - 找出模块中未被使用的导出
  • 🔧 检测缺失的依赖 - 发现代码中使用但未在 package.json 中声明的依赖
  • 🎯 智能插件系统 - 支持 100+ 框架和工具,包括 Next.js、React、Jest 等
  • ⚙️ 自动配置检测 - 几乎无需手动配置,自动识别项目结构

安装

项目已经安装了 Knip,如果需要在其他项目中使用:

bun add -D knip

基本使用

运行检测

# 检测所有问题
npx knip

# 只检测生产环境相关的代码
npx knip --production

# 检测特定类型的问题
npx knip --include files,dependencies

使用项目脚本

我们在 package.json 中配置了便捷的脚本:

# 检测未使用的代码和依赖
bun run lint:unused

# 只检测生产环境相关问题
bun run lint:unused:production

配置文件

项目根目录的 knip.json 配置文件:

{
  "$schema": "https://unpkg.com/knip@5/schema.json",
  "workspaces": {
    ".": {
      "entry": [
        "src/app/**/*.{ts,tsx}",
        "src/server/**/*.{ts,tsx}",
        "middleware.ts",
        "next.config.ts",
        "tailwind.config.ts"
      ],
      "project": [
        "src/**/*.{ts,tsx}",
        "scripts/**/*.{ts,js}"
      ]
    }
  },
  "ignore": [
    "src/types/**",
    "**/*.d.ts",
    "src/lib/database/prisma/schema.prisma",
    "content/**/*.mdx",
    "public/**"
  ],
  "ignoreDependencies": [
    "@types/*",
    "husky",
    "prettier",
    "autoprefixer",
    "postcss",
    "tailwindcss"
  ],
  "ignoreExportsUsedInFile": true
}

配置说明

  • entry: 项目的入口点文件
  • project: 需要分析的项目文件
  • ignore: 忽略的文件和目录
  • ignoreDependencies: 忽略的依赖包
  • ignoreExportsUsedInFile: 忽略在同一文件中使用的导出

常见使用场景

1. 定期代码清理

在重构或发布前运行 Knip 检测:

bun run lint:unused

2. CI/CD 集成

在 GitHub Actions 中添加检测步骤:

- name: Check for unused code
  run: bun run lint:unused

3. 依赖优化

检测并移除未使用的依赖:

# 检测未使用的依赖
npx knip --include dependencies,devDependencies

# 移除检测到的未使用依赖
bun remove package-name

输出解读

Knip 的输出包含以下几种类型:

  • Unused files: 未被引用的文件
  • Unused dependencies: 未使用的生产依赖
  • Unused devDependencies: 未使用的开发依赖
  • Unused exports: 未被使用的导出
  • Missing dependencies: 缺失的依赖声明

注意事项

误报处理

  1. 动态导入: 某些动态导入的代码可能被误报
  2. 配置文件: 某些配置文件可能需要添加到忽略列表
  3. 开发中的代码: 正在开发但尚未集成的代码会被标记为未使用

最佳实践

  1. 逐步清理: 不要一次性删除所有检测到的文件,逐步验证
  2. 运行测试: 清理后务必运行完整的测试套件
  3. 版本控制: 在清理前创建分支或提交,便于回滚
  4. 团队协作: 在团队中建立定期运行 Knip 的习惯

高级功能

自定义预处理器

可以编写自定义预处理器来过滤结果:

// preprocessor.js
const gitPreprocessor = (report) => {
  // 过滤最近修改的文件
  // 实现逻辑...
  return report;
};

export default gitPreprocessor;

使用预处理器:

npx knip --preprocessor ./preprocessor.js

生产模式

使用 --production 模式只检测生产环境相关的代码:

npx knip --production

这对于识别真正影响用户的死代码特别有用。

相关资源

通过定期使用 Knip,我们可以保持代码库的整洁,提升开发效率和项目性能。