开发指南Knip - 死代码检测工具
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: 缺失的依赖声明
注意事项
误报处理
- 动态导入: 某些动态导入的代码可能被误报
- 配置文件: 某些配置文件可能需要添加到忽略列表
- 开发中的代码: 正在开发但尚未集成的代码会被标记为未使用
最佳实践
- 逐步清理: 不要一次性删除所有检测到的文件,逐步验证
- 运行测试: 清理后务必运行完整的测试套件
- 版本控制: 在清理前创建分支或提交,便于回滚
- 团队协作: 在团队中建立定期运行 Knip 的习惯
高级功能
自定义预处理器
可以编写自定义预处理器来过滤结果:
// preprocessor.js
const gitPreprocessor = (report) => {
// 过滤最近修改的文件
// 实现逻辑...
return report;
};
export default gitPreprocessor;
使用预处理器:
npx knip --preprocessor ./preprocessor.js
生产模式
使用 --production
模式只检测生产环境相关的代码:
npx knip --production
这对于识别真正影响用户的死代码特别有用。
相关资源
通过定期使用 Knip,我们可以保持代码库的整洁,提升开发效率和项目性能。