用法与自动修复
基于 Knip v6.17.1 编写
速查
- 自动修复:
knip --fix;删未用文件需显式--allow-remove-files;改完格式化加--format --fix-type限定范围:files/dependencies/exports/types/catalog- 可修:删
export关键字、删package.json依赖、删文件、清pnpm-workspace.yaml的 catalog - 不可修(需手动):补
unlisted依赖、补binaries、解决duplicates重复导出 - 善后:跑
install同步依赖;用 ESLint 或remove-unused-vars清残留未用变量;git diff复核 - 聚焦:
--include/--exclude/--dependencies/--exports/--files;输出:--reporter - 处理误报顺序:文件 → import → 导出 → 依赖(自上而下,避免连锁误报)
自动修复 --fix
bash
# 应用所有可自动修复的问题
knip --fix
# 允许删除未使用的文件(默认不删)
knip --fix --allow-remove-files
# 修复后用本地格式化器(Prettier / Biome / dprint)整理
knip --fix --format--fix 能做的修复:
- 从未使用的导出、re-export、导出类型上移除
export关键字(默认导出则去掉export default) - 从
package.json的dependencies/devDependencies中删除未使用依赖 - 删除未使用的文件(需
--allow-remove-files) - 删除未使用的枚举/命名空间成员
- 移除
pnpm-workspace.yaml中未使用的 catalog 条目
用 --fix-type 限定只修某几类:
bash
knip --fix-type exports,types
knip --fix-type dependencies
knip --fix-type files哪些不能自动修
以下需人工处理(因为存在不确定性):
- 补
unlisted依赖:Knip 不确定该放dependencies还是devDependencies - 补
unlisted的 binaries:同上 duplicates重复导出:需你决定保留哪一个
修复后的善后
务必在版本控制下操作
--fix 会修改源码与 package.json,删文件不可逆。流程建议:
- 确保 Git 工作区干净再运行
--fix - 删依赖后跑
pnpm install(或对应包管理器)同步 lockfile - 移除
export后可能留下未用的局部变量——用 ESLint 或remove-unused-vars清理 git diff逐项复核,必要时回退
聚焦与过滤
只想看某类问题时,用快捷开关或 --include/--exclude:
bash
# 只看依赖相关(dependencies/unlisted/binaries/unresolved/catalog)
knip --dependencies
# 只看导出相关(exports/types/enumMembers/duplicates 等)
knip --exports
# 只看未使用的文件
knip --files
# 精确控制
knip --include files,dependencies
knip --exclude duplicates处理误报
Knip 的核心理念:一个意外的结果,通常是真实发现或配置缺口,而不是要消音的误报。推荐自上而下逐层处理,避免连锁误报:
- 未使用的文件 → 删掉后,连带消除一批"未用导出/依赖"
- 无法解析的 import(unresolved) → 厘清 Knip 能到达的范围
- 未使用的导出 → 此时才是真正的死代码
- 未使用的依赖 → 最后收尾
消除误报的优先级:
- 首选:用
entry把项目结构教给 Knip(见 配置) - 次选:用
@public/@internal标记导出,配tags字段 - 再次:改进/新增对应工具的插件(一次解决、对所有项目生效)
- 最后:
ignoreDependencies/ignoreBinaries/ignore局部消音
常见误报与对策:
| 现象 | 对策 |
|---|---|
| 脚本里的文件被报未使用 | 把该文件加入 entry |
| 动态 import 字符串 | 列入 entry 或 ignoreDependencies |
类型包 @types/* 被报未用 | 若类型已内置于主包,直接删掉它 |
| 直接用了传递依赖 | 在 package.json 显式声明 |
| 仅本文件内用到的导出被报 | 开 ignoreExportsUsedInFile |
详见官方 Handling Issues。